問題:請講下在mysql下如何優化sql
分析:該問題主要考察對mysql的優化,重點考慮對索引優化的掌握。
回答要點:
主要從以下幾點去考慮,
1、什麼樣的sql需要優化?
2、怎麼對sql進行優化?
3、如何避免索引失效?
要優化sql首先要判斷哪些sql需要優化,然後是怎麼優化,最後才是優化
開啟慢查詢
在mysql中慢查詢是預設關閉的,在排查慢sql的時候建議開啟慢查詢,但在生產環境下不建議開啟,因為會對效能造成影響;
explain
在上步中通過慢查詢可以定位到慢sql,接著就可以使用explain關鍵字對慢sql進行分析,explain的作用就是給出sql的執行計劃。
重點關注下面幾列,id、type、possible_keys、key、extra
id代表執行的順序,從大到小依次執行,id相同的情況從上到下執行
type代表連線使用了那種類別,是否使用了索引,從壞到好是all、index、range、ref、eq_ref、const、system。all是全表掃描;index使用索引;range表示範圍查詢;ref表示用到了非唯一索引;eq_ref表示使用唯一索引;const表示主鍵索引且是等值比較;system表示查詢的系統表;
possible_keys代表可能用到的索引鍵
key代表實際用到的索引鍵
rows代表掃描的行數
extra代表除了已經顯示的資訊外同樣重要的資訊,常見的取值有using where using index usingfilesort usingtemporary。using where 表示使用了where條件;using index表示使用到了索引;usingfilesort表示使用到了檔案排序,不是使用索引排序;usingtemporary表示用到了臨時表,多用在order by/group by上
避免索引失效
索引在sql的優化方面佔據了很大的比重,如何避免索引失效那
1、避免隱式的資料型別轉換;例,where id=10 id為varchar型別,這時索引失效
2、在like中避免使用字首%;例,where id like '%12',這時索引失效,如果讓索引不失效,需要使用覆蓋索引
3、避免在where條件中進行運算;例,where concat(id,'12')=12,這時索引失效
4、不符合索引匹配的最左原則的;多用在聯合索引上,沒使用到聯合索引的第一個欄位;
5、mysql使用分析器,分析出來的結果是全表掃描更快,這時也不會使用索引;