MySQL explain 中列的取值及含義講解
前言
今天看 《MySQL 是怎樣允許的》和 《高性能MySQL》索引相關的部分,覺得有必要整理下 explain 中列的取值及含義。以后工作的時候翻閱查找更快。
type
type 取值 | 含義 |
---|---|
const | 使用主鍵 或 唯一二級索引 |
eq_ref | 被驅動表,用主鍵 或 唯一二級索引進行 (索引列不為空) |
ref | 普通 的二級索引進行等值匹配 (索引列不為空) |
ref_or_null | 普通 的二級索引進行等值匹配 (索引可以為空) |
index_merge | TODO 索引合并相關的內容待探索 |
unique_subquery | 查詢優(yōu)化器把 in 語句優(yōu)化成 exists,使用了主鍵 或 唯一二級索引進行 (索引列不為空) |
index_subquery | 查詢優(yōu)化器把 in 語句優(yōu)化成 exists,使用了普通索引 |
range | 范圍掃描 |
index | 1. 使用索引覆蓋, 但是要掃描全部的索引記錄 where條件只命中部分索引 2. 全表掃描, 并且要對主鍵進行排序 |
all | 全表掃描 |
ref
表示等值匹配用的是什么
ref 取值 | 含義 | 相關列 |
---|---|---|
const | 與key列的索引名等值匹配 | key |
表的列名 | 與該列進行等值匹配 | |
func | 函數 |
rows
預計掃描的行數
filtered
是一個百分比數,key1 掃描的數作為分母, common_field 命中的結果為分子
select * from s1 where key1 > 'z' and common_field = 'a'
表關聯(lián)的時候,這個指標比較重要,針對下表數據
table | rows | filtered |
---|---|---|
s1 | 9688 | 10 |
s2 | 1 | 100 |
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 優(yōu)化掉額外的排序操作
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 查詢優(yōu)化器的具體工作過程
到此這篇關于MySQL explain 中列的取值及含義的文章就介紹到這了,更多相關MySQL explain列的取值及含義內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
windows 64位下mysql 8.0.13 安裝配置方法圖文教程
這篇文章主要為大家詳細介紹了windows 64位下mysql 8.0.13 安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-11-11MySQL安裝starting?the?server失敗的2種解決辦法(推薦!)
MySQL是一個非常強大的關系型數據庫,但有些初學者在安裝配置的時候,遇到種種的困難,下面這篇文章主要給大家介紹了關于MySQL安裝starting?the?server失敗的2種解決辦法,需要的朋友可以參考下2023-04-04利用mysql的inet_aton()和inet_ntoa()函數存儲IP地址的方法分享
當前很多應用都適用字符串char(15)來存儲IP地址(占用16個字節(jié)),利用inet_aton()和inet_ntoa()函數,來存儲IP地址效率很高,適用unsigned int 就可以滿足需求,不需要使用bigint,只需要4個字節(jié),節(jié)省存儲空間,同時效率也高很多2012-03-03