Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL explain列的取值

MySQL explain 中列的取值及含义讲解

作者:Ch.yang

这篇文章主要介绍了MySQL explain 中列的取值及含义,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

前言

今天看 《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列的取值及含义内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文