首頁 > 軟體

MySQL explain 中列的取值及含義講解

2023-09-06 22:17:25

前言

今天看 《MySQL 是怎樣允許的》和 《高效能MySQL》索引相關的部分,覺得有必要整理下 explain 中列的取值及含義。以後工作的時候翻閱查詢更快。

type

type 取值含義
const使用主鍵 或 唯一二級索引
eq_ref被驅動表,用主鍵 或 唯一二級索引進行 (索引列不為空)
ref普通 的二級索引進行等值匹配 (索引列不為空)
ref_or_null普通 的二級索引進行等值匹配 (索引可以為空)
index_mergeTODO 索引合併相關的內容待探索
unique_subquery查詢優化器把 in 語句優化成 exists,使用了主鍵 或 唯一二級索引進行 (索引列不為空)
index_subquery查詢優化器把 in 語句優化成 exists,使用了普通索引
range範圍掃描
index1. 使用索引覆蓋, 但是要掃描全部的索引記錄 where條件只命中部分索引
2. 全表掃描, 並且要對主鍵進行排序
all全表掃描

ref

表示等值匹配用的是什麼

ref 取值含義相關列
const與key列的索引名等值匹配key
表的列名與該列進行等值匹配
func函數

rows

預計掃描的行數

filtered

是一個百分比數,key1 掃描的數作為分母, common_field 命中的結果為分子

select * from s1 where key1 > 'z' and common_field = 'a'

表關聯的時候,這個指標比較重要,針對下表資料

tablerowsfiltered
s1968810
s21100

extra

extra 取值含義
Using index使用了索引覆蓋
Using index condition使用了索引下推
Using where在 server 層進行了判斷(沒有索引的列)
Using join buffer (Block Nested Loop)不能有效利用索引時,退而求其次使用快取
Using filesort使用記憶體或者磁碟進行檔案排序
Using temporary使用了臨時表

補充: 簡單闡述索引下推

client -> server -> 儲存引擎,下推的意思是把篩選放到儲存引擎,減少回表的資料量

形如 where key1 > xxx and key3 like ‘%a’ ,5.6 版本 like 的操作是在server層處理的,5.7.x的版本後可以在儲存引擎層完成過濾。

補充:group by 優化掉額外的排序操作

select common_field, count(*) as amount from s1 group by common_field;
-- 以上語句會被 mysql 補充為
select common_field, count(*) as amount from s1 group by common_field order by common_field;
-- 如果要省略檔案排序, 則顯式宣告為 order by null
select common_field, count(*) as amount from s1 group by common_field order by null;

後記

TODO: 用 otpimzer trace 查詢優化器的具體工作過程

到此這篇關於MySQL explain 中列的取值及含義的文章就介紹到這了,更多相關MySQL explain列的取值及含義內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com