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

小林coding

共 2185字,需浏览 5分钟

 ·

2021-12-29 09:18

高广超,https://www.jianshu.com/p/ea3fc71fdc45

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

图解系列文章:
图解文章汇总
计算机基础学习路线
小林的图解系统,大曝光!
不鸽了,小林的「图解网络 3.0 」发布!
为了拿捏 Redis 数据结构,我画了 40 张图(完整版)
浏览 14
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报