數據庫調優教程(四)Explain性能分析命令

上一章我們將瞭如何發現慢查詢並把語句記錄到日誌中,那麼在發現慢查詢後,要怎樣才能知道語句的問題發生在哪裏。本章將介紹怎樣使用Mysql提供的數據庫性能分析命令,對sql語句進行分析。


二、數據庫性能分析Explain命令


Explain的作用是生成一個QEP(查詢執行計劃),可以幫助我們在不真正執行某個sql語句時,就看到mysql怎樣執行,這樣方便我們去分析sql指令的好壞。

執行如下語句

[plain] view plaincopy
  1. 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,答案自然是創建一個覆蓋索引,同樣,筆者將會在之後章節介紹覆蓋索引如何創建。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章