MySQL之Explain(執行計畫),mysqlexplain
今天,資料庫的操作越來越成為整個應用的效能瓶頸了,這點對於Web應用尤其明顯。關於資料庫的效能,這並不只是DBA才需要擔心的事,而這更是我們程式員需要去關注的事情。當我們去設計資料庫表結構,對操作資料庫時(尤其是查表時的SQL語句),我們都需要注意資料操作的效能。這裡,我們不會講過多的SQL語句的最佳化,而只是針對MySQL這一Web應用最多的資料庫
1.explain(查看執行計畫):使用Explain關鍵字可以類比最佳化器執行SQL查詢語句,從而知道MySql是如何處理你的SQL語句的,分析你的查詢語句或是表結構的效能瓶頸。
(1.)能幹嘛?
(2.)怎麼玩
1.Explain+SQL語句
2.執行計畫包含的資訊
2.各名詞解釋
(1)id
一.第一種情況
二.第二種情況
三.第三種情況
(2).select_type
一.有哪些
simple: 簡單的select查詢,查詢中不包括子查詢或者union
primary: 查詢中若包含任何複雜的子部分,最外層查詢則被標記為
subQuery: 在select或where列表中包括子查詢
derived: 在from列表中包括的子查詢被標記為derived。mysql會遞迴執行這些子查詢,把結果放在暫存資料表裡。
union: 若第二個select出現在union之後,則被標記為union。若union包含在from子句的子查詢中,外層select將被標記為derived
union result: 從union表中擷取的結果select。
查詢的類型,主要用於區別普通查詢,聯集查詢,子查詢等的複雜查詢
(3).type:訪問資料類型
一.有哪些值
從最好到最差依次是:
System>const>eq_ref>ref>range>index>All
一般來說,的保證查詢至少達到range層級,最好能達到ref
| type類型 |
說明 |
| All |
最壞的情況,從頭到尾全表掃描 |
| index |
和全表掃描一樣。只是掃描表的時候按照索引次序進行而不是行。主要優點就是避免了排序, 但是開銷仍然非常大。如在Extra列看到Using index,說明正在使用覆蓋索引,只掃描索引的資料,它比按索引次序全表掃描的開銷要小很多 |
| range |
範圍掃描,一個有限制的索引掃描。key 列顯示使用了哪個索引。當使用=、 <>、>、>=、<、<=、IS NULL、<=>、BETWEEN 或者 IN 操作符,用常量比較關鍵字列時,可以使用 range |
| ref |
一種索引訪問,它返回所有匹配某個單個值的行。此類索引訪問只有當使用非唯一性索引或唯一性索引非唯一性首碼時才會發生 |
| eq_ref |
最多隻返回一條合格記錄。使用唯一性索引或主鍵尋找時會發生 (高效) |
| const/system |
當主鍵放入where子句時,mysql把這個查詢轉為一個常量(高效) |
| null |
意味說mysql能在最佳化階段分解查詢語句,在執行階段甚至用不到訪問表或索引(高效) |
(4)possible_key
一:顯示可能應用在這張表中的索引,,一個或多個,查詢涉及到的欄位上若存在索引,則該索引將被列出,但不一定被查詢實際使用
(5)key
一.實際使用的索引,如果為null,則沒有使用索引
二.查詢中若使用了覆蓋索引,則該索引僅出現在key列表中
(6)key_len
一.表示索引中使用的位元組數,可通過該列計算查詢中使用的索引的長度,在不損失精度的情況下,長度越短越好。
二.key_len顯示的值為索引欄位的最大可能長度,並非實際使用長度,即key_len是根據表定義計算而得,不是通過表內檢索出來的。
(7)ref
一.顯示索引的那一列被使用了,如果使用的話,是一個常數,那些列或常量被用於尋找索引列的值
(8)rows
一. 根據表統計資訊及索引選用情況,大致估算出找到所需的記錄所需要讀取的行數
(9).Extra
額外資訊。如using index,using filesort,using where 等