SQL 優化 - explain 的使用


通過關鍵字 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可以直觀看出優化結果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM