MySQL Explain 命令使用详解

MySQL explain 命令是查询性能优化不可缺少的一部分,该文主要讲解 explain 命令的使用及相关参数说明。

explain 命令基本使用

在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的 SQL 语句,找出这些 SQL 语句并不意味着完事了。

此时我们常常用到 explain 这个命令来查看一个这些 SQL 语句的执行计划,查看该 SQL 语句有没有使用上了索引,有没有做全表扫描。

mysql> explain select * from servers;
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
| id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | servers | ALL  | NULL          | NULL | NULL    | NULL |    1 | NULL  |
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
1 row in set (0.03 sec)

expain 出来的信息有 10 列,分别是 id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra,下面对这些字段出现的可能进行解释:

EXPLAIN Output Columns

id

id 是用来顺序标识整个查询中 SELELCT 语句的,在嵌套查询中 id 越大的语句越先执行。该值可能为 NULL,如果这一行用来说明的是其他行的联合结果。

select_type

表示查询的类型

table

对应行正在访问哪一个表,表名或者别名

  • 关联优化器会为查询选择关联顺序,左侧深度优先

  • 当 from 中有子查询的时候,表名是 derivedN 的形式,N 指向子查询,也就是 explain 结果中的下一列

  • 当有 union result 的时候,表名是 union 1,2 等的形式,1,2 表示参与 union 的 query id

注意:MySQL 对待这些表和普通表一样,但是这些“临时表”是没有任何索引的。

type

type 显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL ,一般来说,得保证查询至少达到 range 级别,最好能达到 ref。

possible_keys

显示查询使用了哪些索引,表示该索引可以进行高效地查找,但是列出来的索引对于后续优化过程可能是没有用的

key

key 列显示 MySQL 实际决定使用的键(索引)。如果没有选择索引,键是 NULL。要想强制 MySQL 使用或忽视 possible_keys 列中的索引,在查询中使用 FORCE INDEX、USE INDEX 或者 IGNORE INDEX。

key_len

key_len 列显示 MySQL 决定使用的键长度。如果键是 NULL,则长度为 NULL。使用的索引的长度。在不损失精确性的情况下,长度越短越好 。

ref

ref 列显示使用哪个列或常数与 key 一起从表中选择行。

rows

rows 列显示 MySQL 认为它执行查询时必须检查的行数。注意这是一个预估值

Extra

Extra 是 EXPLAIN 输出中另外一个很重要的列,该列显示 MySQL 在查询过程中的一些详细信息,MySQL 查询优化器执行查询的过程中对查询计划的重要补充信息。

参考资料

  1. 《高性能 mysql 第三版》

  2.  https://dev.mysql.com/doc/refman/5.7/en/explain-output.html

  3.  https://www.cnblogs.com/xuanzhi201111/p/4175635.html

转载:搞懂 MySQL Explain 命令之前不要说自己会SQL优化 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值