通過關鍵字 explain 可以分析出:
1. 表的讀取順序
2. 表的讀取操作的讀取類型
3. 哪些索引有可能會被使用到
4. 哪些索引被實際使用了
5. 表之間的引用
6. 每張表有多少行被優化器查詢
每個字段的含義:
1. id - id值越大,就越先被MySQL執行,如果id相同的話 可以認為是同一組,按照從上到下順序執行。
2. select_type - 查詢類型,是簡單查詢、子查詢、主鍵查詢等,具體類型如下:
SIMPLE(簡單的SELECT語句)
PRIMARY(查詢中最外層的SELECT)/UNION(查詢中處於內層的SELECT)
DEPENDENT UNION(UNION操作中,查詢中處於內層的SELECT)/UNIOIN RESULT(UNION操作的結果,id值通常為NUL)
SUBQUERY(子查詢中首個SELECT)/DEPENDENT SUBQUERY(嚴重消耗性能)(子查詢中首個SELECT,但依賴於外層的表)
DERIVED(被驅動的SELECT子查詢)/MATERIALIZED(被物化的子查詢)
UNCACHEABLE SUBQUERY(對於外層的主表,子查詢不可被物化,每次都需要計算)/UNCACHEABLE UNION(UNION操作中,內層的不可被物化的子查詢)
3. table - 該行所引用的表名
4. type - 顯示了查詢使用到了那種類型,從最優的查詢到最差的排序為:索引type從優到差:System-->const-->eq_ref-->ref-->ref_or_null-->index_merge-->unique_subquery-->index_subquery-->range-->index-->all(全表掃描)
5. possible_key - 能會用到那些索引在該表中找到行級記錄
6. key - 實際從 possible_key 選擇使用的索引。如果為 NULL,則沒有使用索引。很少的情況 下,MYSQL 會選擇優化不足的索引。這種情 況下,可以在 SELECT語句中使用 USE INDEX (indexname)來強制使用一個索引或者用IGNORE INDEX(indexname)來強制 MYSQL 忽略索引.
7. key_len - 使用的索引的長度。在不損失精確性的情況下,長度越短越好。
8. ref - 顯示索引的哪一列被使用了,如果可能的話,是一個常數,哪些列或者常量被用於查找索引列上的值。
9. rows - 顯示MySQL認為它執行查詢時必須檢查的行數。多行之間的數據相乘可以估算要處理的行數。
10. filtered - 顯示了通過條件過濾出的行數的百分比估計值。
11. Extra - 就是除了以上MySQL要展示的重要的信息之外的一個附加信息,一般四種情況
Using filesort
Using temporary
Using index
Not exists
重要!
key、type 、rows、extra,其中 key 為 null 時,說明沒有使用到索引,需要調整索引,type為all的地方,都是需要進行優化的地方.一般需要達到 ref級別,范圍查找需要達到 range,extra有Using filesort、Using temporary 的一定需要優化,根據rows可以直觀看出優化結果。