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

問題:請講下在mysql下如何優化sqlmysql

分析:該問題主要考察對mysql的優化,重點考慮對索引優化的掌握。sql

回答要點:性能

主要從如下幾點去考慮,優化

一、什麼樣的sql須要優化?排序

二、怎麼對sql進行優化?索引

三、如何避免索引失效?file

 

要優化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的優化方面佔據了很大的比重,如何避免索引失效那

一、避免隱式的數據類型轉換;例,where id=10  id爲varchar類型,這時索引失效

二、在like中避免使用前綴%;例,where id like '%12',這時索引失效,若是讓索引不失效,須要使用覆蓋索引

三、避免在where條件中進行運算;例,where concat(id,'12')=12,這時索引失效

四、不符合索引匹配的最左原則的;多用在聯合索引上,沒使用到聯合索引的第一個字段;

五、mysql使用分析器,分析出來的結果是全表掃描更快,這時也不會使用索引;

相關文章
相關標籤/搜索