前言
今天看 《mysql 是怎样允许的》和 《高性能MySQL》索引相关的部分,觉得有必要整理下 explain 中列的取值及含义。以后工作的时候翻阅查找更快。
type
type 取值 | 含义 |
---|---|
const | 使用主键 或 唯一二级索引 |
eq_ref | 被驱动表,用主键 或 唯一二级索引进行 (索引列不为空) |
ref | 普通 的二级索引进行等值匹配 (索引列不为空) |
ref_or_null | 普通 的二级索引进行等值匹配 (索引可以为空) |
index_merge | TODO 索引合并相关的内容待探索 |
unique_subquery | 查询优化器把 in 语句优化成 exists,使用了主键 或 唯一二级索引进行 (索引列不为空) |
index_subquery | 查询优化器把 in 语句优化成 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'
表关联的时候,这个指标比较重要,针对下表数据
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 优化掉额外的排序操作
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列的取值及含义内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!