mysql 執行計劃分析
- sql如何使用索引
- 聯接查詢的執行順序
- 查詢掃描的數據行數
ID列
- id列中的數據爲一組數字,表示執行select語句順序
- id值相同時,執行順序由上至下
- id值越大優先級越高,越先被執行
SELECT_TYPE列
- SIMPLE: 不包含子查詢或是union操作的查詢
- primary :查詢中如果包含任何子查詢,那麼最外層的查詢則被標記爲 primary
- SUBQUERY : SELECT列表中的子查詢
- DEPENDENT SUBQUERY: 依賴外部結果的子查詢
- UNION Union操作的第二個或是之後的查詢的時爲 union
- DEPENDENT unioin : 當union作爲子查詢時,第二或是第二個後的查詢的 select_type值
- union result :union產生的結果集
- derived :出現在from子句中的子查詢
TABLE列
- 輸出數據行所在的表的名稱
- < unionM,N>由ID爲M,N查詢union產生的結果集
- < derivedN>/< subqueryN> 由Id爲n的查詢產生的結果
PARTITIONS列
- 對於分區表,顯示查詢的分區ID
- 對於非分區表,顯示的爲 NULL
TYPE列
性能從上到下,由高到低
- system 這是const聯接類型的一個特例,當查詢的表只有一行時使用
- const 表中有且只有一個匹配的行時使用,如對主鍵或是唯一索引的查詢,這是效率最高的聯接方式
- eq_ref :唯一索引或主鍵引查找,對於每個索引鍵,表中只有一條記錄與之匹配。
- ref 非唯一索引查找,返回匹配某個單獨值的所有行。
- ref_or_null 類似於 ref類型的查詢,但是附加了對 null 值列的查詢
- index_merge 該聯接類型表示使用了索引合併優化的方法
- range 索引範圍的掃描常見於 between, > ,<這樣的查詢條件
- index full index scan全索引掃描,通all的區別時,遍歷的時索引樹
- all full tabel scan 全表掃描,這是效率最差的聯接方式
Extra列
- Distinct 優化distinct操作,在找到第一匹配的元祖後即停止找同樣的動作
- Not exists 使用 not exists 來優化查詢
- Using filesort 使用額外操作進行排序,通常會出現在order by 或 group by 查詢
- Using index 使用了覆蓋索引進行查詢
- Using temporary mysql需要使用臨時表來處理查詢,常見於排序,子查詢,和分組查詢
- Using where 需要在mysql服務器層使用 where條件來過濾數據
- slect tables /optimized away 直接通過索引來獲得數據,不用訪問表
POSSIBLE_KEYS列
- 指出mysql能使用那些索引來優化查詢
- 查詢列所涉及的列上的索引都會被列出來,但不一定會被使用
KEY列
- 查詢優化器優化查詢實際所使用的索引
- 如果沒有可用的索引,則顯示 null
KEY_LEN列
- 表示索引字段的最大的可能長度
- key_len的長度由字段定義計算而來,並非數據的實際長度
Ref列
- 表示那些列或常量被用於查找索引列上的值
rows列
- 表示msql通過索引的統計信息,估算的所需讀取的行數
- rows值的大小時個統計抽樣的結果,並不十分的準確
Filtered列
- 表示返回的結果的行數佔需要讀取行數的百分比
- Filtered列的值越大越好
- Filtered列的值依賴的說統計信息
執行計劃的限制
- 無法展示存儲過程,觸發器,udf對查詢的影響
- 無法使用 explain對存儲過程進行分析
- 早期版本的mysql只支持對select語句進行分析
轉載:https://www.cnblogs.com/nirao/p/9721964.html