java面試一日一題:如何優化sql

迷茫中守候發表於2021-04-13

問題:請講下在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使用分析器,分析出來的結果是全表掃描更快,這時也不會使用索引;

相關文章