淺談MySQL優化技巧

今天來學習一下MySQL優化技巧。面試

一、Explain

善用 explain 查看SQL執行計劃sql

image

  • type列,鏈接類型。一個好的sql語句至少要達到range級別。杜絕出現all級別
  • key列,使用到的索引名。若是沒有選擇索引,值是NULL。能夠採起強制索引方式
  • key_len列,索引長度
  • rows列,掃描行數。該值是個預估值
  • extra列,詳細說明。注意常見的不太友好的值有:Using filesort, Using temporary

二、SELECT語句務必指明字段名稱

  • SELECT * 增長不少沒必要要的消耗(cpu、io、內存、網絡帶寬)
  • 使用SELECT * 沒法使用覆蓋索引

三、SQL語句中IN包含的值不該過多

MySQL對於IN作了相應的優化,即將IN中的常量所有存儲在一個數組裏面,並且這個數組是排好序的。可是若是數值較多,產生的消耗也是比較大的。再例如:select id from table_name where num in(1,2,3) 對於連續的數值,能用 between 就不要用 in 了;再或者使用鏈接來替換。數據庫

四、當只須要一條數據的時候,使用limit 1

  • 當你只想要返回一條數據時,加上 LIMIT 1 能夠增長性能。這樣同樣,MySQL數據庫引擎會在找到一條數據後中止搜索,而不是繼續日後查少下一條符合記錄的數據。
  • 這是爲了使EXPLAIN中type列達到const類型

五、避免在 where 子句中對字段進行 null 值判斷

對於null的判斷會致使引擎放棄使用索引而進行全表掃描。數組

六、不建議使用%前綴模糊查詢

例如LIKE 「%name」或者LIKE 「%name%」,這種查詢會致使索引失效而進行全表掃描。可是可使用LIKE 「name%」。網絡

七、避免在where子句中對字段進行表達式操做

好比
select user_id,user_project from table_name where age*2=36;性能

中對字段就好了算術運算,這會形成引擎放棄使用索引,建議改爲學習

select user_id,user_project from table_name where age=36/2;優化

八、對於聯合索引來講,要遵照最左前綴法則

舉列來講索引含有字段id,name,school,能夠直接用id字段,也能夠id,name這樣的順序,可是name,school都沒法使用這個索引。因此在建立聯合索引的時候必定要注意索引字段順序,經常使用的查詢字段放在最前面。spa

九、注意範圍查詢語句

對於聯合索引來講,若是存在範圍查詢,好比between,>,<等條件時,會形成後面的索引字段失效。code

十、使用合理的分頁方式以提升分頁的效率

select id,name from table_name limit 866613, 20

使用上述sql語句作分頁的時候,可能有人會發現,隨着表數據量的增長,直接使用limit分頁查詢會愈來愈慢。

優化的方法以下:能夠取前一頁的最大行數的id,而後根據這個最大的id來限制下一頁的起點。好比此列中,上一頁最大的id是866612。sql能夠採用以下的寫法。

select id,name from table_name where id> 866612 limit 20

十一、必要時可使用force index來強制查詢走某個索引

有的時候MySQL優化器採起它認爲合適的索引來檢索sql語句,可是可能它所採用的索引並非咱們想要的。這時就能夠採用force index來強制優化器使用咱們制定的索引。

參考

面試官:給我談談你平時是如何優化sql的

相關文章
相關標籤/搜索