對于複雜、效率低的sql語句,我們通常是使用explain sql 來分析sql語句,這個語句可以列印出,語句的執行過程。這樣友善我們分析,進行優化。
首先,說一下,explain查詢出來的資料如何分析。
table :這一列是查詢設計的表。
type :很重要的一列,顯示了查詢使用了那種類型,是否使用的索引,能反映出語句的品質。一般這個名額從好到壞依次是:system>const>eq_ref>ref(最好能達到)>fulltext>ref_or_null>index_merge>unique_subquery>index_subquery>range>index>ALL
為了保證查詢至少達到range級别。最好達到ref,否則的話,隻能說明這條語句性能有待提高。
ref表示所有具有比對的索引的行都被用到
range索引範圍内查找
index全索引樹掃描
all全表掃描
possible_keys:指出mysql在試用了哪個索引在該表中查找行。如果沒有使用任何索引,就顯示的NULL,可以用于對優化時的索引調整。
key:顯示使用的索引,如果沒有使用,則顯示NULL
key_len:顯示的是所使用的索引長度,如果沒使用,則是NULL。當然,在使用索引的情況下,索引長度越小。效果越明顯。
ref:顯示使用那個列或常數雨key一起從表中選擇行。
rows:執行查詢的行數,如果行數越小,說明查詢次數越少,效率越高。
extra:包含查詢mysql解決查詢的詳細資訊。
在上面的查詢解釋表中,type為ALL是以,這個查詢是全表掃描,并沒有使用索引。是以,我們要分析這條語句中,哪個查詢條件,适合添加索引。這個要根據具體問題具體分析了。
接下來,我對role表中的priority_level添加索引,添加後執行結果如下:
查詢次數變少了。而且也用到了剛才加的pl_idx索引。查詢效率提高了。當然這隻是優化了一小步。也隻是初步認識了一下explain。還需要多加練習。