【MySQL】explain 中列的取值及含义

文章目录

    • 前言
    • type
    • ref
    • rows
    • filtered
    • extra
    • 后记

前言

今天看 《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

要对 s2表查询 9688 * 10% = 968 次。

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,数据库)