資料庫調優教程(四)Explain效能分析命令,調優explain
上一章我們將了如何發現慢查詢並把語句記錄到日誌中,那麼在發現慢查詢後,要怎樣才能知道語句的問題發生在哪裡。本章將介紹怎樣使用Mysql提供的資料庫效能分析命令,對sql語句進行分析。
二、資料庫效能分析Explain命令
Explain的作用是產生一個QEP(查詢執行計畫),可以協助我們在不真正執行某個sql語句時,就看到mysql怎樣執行,這樣方便我們去分析sql指令的好壞。
執行如下語句
Explain select * from emp where empno = 3333\G
對於返回的資訊,我們主要關心一下幾個
1) Type
ALL全表掃描,通常是不好的,其他的如index、range、const、ref、system則是較好的
2) Possible_keys
可能被用到的索引
3) Key
查詢過程中實際使用的索引,當為null時表示沒有使用索引,通常是不好的
4) key_len
索引欄位最大可能使用的長度,也叫索引基數。索引基數越大,表明可能尋找的行數越多,查詢效率越慢。
5) Rows
MySQL 估計的需要掃描的行數。只是一個估計。越多表明尋找的行數越多,自然越慢。
6) Extra
顯示上述資訊之外的其它資訊,非常重要。其主要有一下返回結果。
Usingindex
表明此查詢使用了覆蓋索引(CoveringIndex),即通過索引就能返回結果,無需訪問表。(覆蓋索引是一種非常優秀的索引,其使用見http://blog.csdn.net/hzy38324/article/details/44857721)
若沒顯示"Usingindex"表示讀取了表資料。
Usingindex condition
可能會使用索引
Usingwhere
表示 MySQL 伺服器先讀取整行資料,再檢查此行是否符合 where 句的條件,符合就留下,不符合便丟棄。效率較慢。
Usingfilesort
表示Mysql會按查詢所需的順序對結果進行排序,這時就會出現 Usingfilesort 。排序自然會增加查詢時間,導致效率變慢。解決方案是利用索引進行排序。若查詢所需的排序與使用的索引的排序一致,因為索引是已排序的,因此按索引的順序讀取結果返回,此時就不會出現Using filesort。
關於“Using index” 和 “Using index condition”的區別,筆者參考了一下stackoverflow上的一篇文章
http://stackoverflow.com/questions/1687548/mysql-explain-using-index-vs-using-index-condition
裡面是這麼解釋的
簡單的說
Using index就是一定使用索引,這種索引成為覆蓋索引,Using index condition則是在必要的時候才使用索引
怎樣才能讓Usingindex condition變成Using index,答案自然是建立一個覆蓋索引,同樣,筆者將會在之後章節介紹覆蓋索引如何建立。
本章結束,下一章我們將全面講解效能最佳化的利器——索引。