MySQL explain分析

参看博客:
https://segmentfault.com/a/1190000008131735
https://dev.mysql.com/doc/refman/5.7/en/explain-output.html#jointype_ref_or_null
https://tech.meituan.com/2014/06/30/mysql-index.html

explain type字段

type的类型说明(性能由上到下降低)例子
system表中只有一条数据. 这个类型是特殊的 const 类型
const针对主键或唯一索引的等值查询扫描, 最多只返回一行数据. const 查询速度非常快, 因为它仅仅读取一次即可.SELECT * FROM tbl_name WHERE primary_key=1;

SELECT * FROM tbl_name WHERE primary_key_part1=1 AND primary_key_part2=2;
eq_ref此类型通常出现在多表的 join 查询, 表示对于前表的每一个结果, 都只能匹配到后表的一行结果. 并且查询的比较操作通常是 =, 查询效率较高.SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column;

SELECT * FROM ref_table,other_table WHERE ref_table.key_column_part1=other_table.column AND ref_table.key_column_part2=1;
ref此类型通常出现在多表的 join 查询, 针对于非唯一或非主键索引, 或者是使用了 最左前缀 规则索引的查询SELECT * FROM ref_table WHERE key_column=expr;

SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column;

SELECT * FROM ref_table,other_table WHERE ref_table.key_column_part1=other_table.column AND ref_table.key_column_part2=1;
fulltextjoin操作使用了全文索引
ref_or_nullSELECT * FROM ref_table WHERE key_column=expr OR key_column IS NULL;
index_merge
unique_subquery
index_subquery
range表示使用索引范围查询, 通过索引字段范围获取表中部分数据记录. 这个类型通常出现在 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN() 操作中
index
ALL

explain table字段


输出行引用的表的名称,或者是:
< unionM,N >:行指的是id值为M和的行 的 并集 N。
< derivedN >:该行是指用于与该行的派生表结果id的值 N。例如,派生表可能来自FROM子句中的子查询 。
< subqueryN >:行指的是id 值为的行的具体化子查询的结果N。

union查询
EXPLAIN ( SELECT * FROM testArrange WHERE testArrangeID IN ( 31, 32, 33 ) )
UNION
( SELECT * FROM testArrange WHERE testArrangeID IN ( 43, 45, 47 ) );Union查询

explain partitions字段

查询将匹配记录的分区。

explain select_type字段

select_type说明
SIMPLE表示此查询不包含 UNION 查询或子查询
PRIMARY表示此查询是最外层的查询
UNION表示此查询是 UNION 的第二或随后的查询
DEPENDENT UNIONUNION 中的第二个或后面的查询语句, 取决于外面的查询
UNION RESULTUNION 的结果
SUBQUERY子查询中的第一个 SELECT
DEPENDENT SUBQUERY子查询中的第一个 SELECT, 取决于外面的查询. 即子查询依赖于外层查询的结果

explain possible_keys

      表示 MySQL 在查询时, 能够使用到的索引. 但即使有些索引在 possible_keys 中出现, 并不表示此索引会真正地被 MySQL 使用到. MySQL 在查询时具体使用了哪些索引, 由 key 字段决定。

key

此字段是 MySQL 在当前查询时所真正使用到的索引。

key_len

表示查询优化器使用了索引的字节数. 这个字段可以评估组合索引是否完全被使用, 或只有最左部分字段被使用到。

key_len 的计算规则:

类型计算规则
char(n byte)3n byte
varchar(n)3n+2 byte(utf8)、4n+2 byte(utf8mb4)
TINYINT1 byte
SMALLINT2 byte
MEDIUMINT3 byte
INT4 byte
BIGINT8 byte
DATE3 byte
TIMESTAMP4 byte
DATETIME8 byte
字段可以为空占1 byte

rows

rows是核心指标。绝大部分rows小的语句执行一定很快(有例外,下面会讲到),所以优化语句基本上都是在优化rows。

extra

当 Extra 中有 Using filesort 时, 表示 MySQL 需额外的排序操作, 不能通过索引顺序达到排序效果. 一般有 Using filesort, 都建议优化去掉, 因为这样的查询 CPU 资源消耗大.
如:
在这里插入图片描述
可以建立联合索引 index(‘student_id’,‘term’,‘courseClass_id’) 使extra不用using filesort,具体可参看上面的博客。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值