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