從左到右,效能由最差到最好。 3.1 type=ALL 全表掃描, 3.2 type=index 索引全掃描,遍歷整個索引來查詢匹配的行 3.3 type=range 索引範圍掃描,常見於 <,<=,>,>=,between,in等操作符。 例 explain select * from adminlog where id>0 , explain select * from adminlog where id>0 and id<=100 explain select * from adminlog where id in (1,2) 3.4 type=ref
: 可能使用的索引列表.5、key : 實現執行使用索引列表6、key_len: 索引的長度7、ref : 顯示使用哪個列或常數與key一起從表中選擇行。8、row: 執行查詢的行數,簡單且重要,數值越大越不好,說明沒有用好索引9、filtered:10、Extra: 該列包含MySQL解決查詢的詳細資訊。 10.1 Not exists 10.2 range checked for each record 沒有找到合適的索引 10.5 using index 只使用索引樹中的資訊而不需要進一步搜尋讀取實際的行來檢索表中的資訊。就是建議取索引列。這樣就可以不要通過索引去實際表中找資料了。直接返回索引列的資料。一次查詢。否則就是索引表查一次,實際表中查一次。 10.6 using temporary為了解決查詢,MySQL需要建立一個臨時表來容納結果。典型情況如查詢包含可以按不同情況列出列的GROUP BY和ORDER BY子句時。無效索引
: 資料變化不大的列。如XX型別,是否有效,專案ID等列的索引都是無效的。這些無效索引還是影響Insert 、Update、Delete 語句的效能。因為這些語包的執行都要對索引表進行更新。又因為這些表的值變化不大,資料庫很難為他們合理分配索引。所以影響語句的效能。IN,OR 是否會走索引:一條SQL會不會走索引一個看條件使用的運算子,另一個看有沒有索引。所以SQL會不會走索引和IN.OR,group by 沒有關係。什麼運算子不走索引,<>,!=OR 有個點要注意一下:就OR前後兩個條件都要有索引整個SQL才會使用索引。只要有一個條件沒索引那麼整個SQL都不使用索引。如果出現OR的一個條件沒有索引時,建議使用 union