查看MySQL执行计划,了解每个参数含义

引言

本文是对 MqSQL是怎样运行的 一文的学习总结,更多细节可以去了解 小孩子(作者)的原文

查看MySQL专项计划是对执行sql语句优化比不可少的一种途径,查询一条sql 的执行计划非常简单,只需要在执行sql语句之前加上EXPLAIN即可。但是重要的是如何读懂查询执行计划的结果。下面我们就对执行计划的结果读取中,常用的字段含义,以及常用到的知识点进行总结。

查询计划命令:
mysql> EXPLAIN SELECT 1;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra          |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
|  1 | SIMPLE      | NULL  | NULL       | NULL | NULL          | NULL | NULL    | NULL | NULL |     NULL | No tables used |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
1 row in set, 1 warning (0.01 sec)
列含义:
列名描述
id在一个大的查询语句中每个SELECT关键字都对应一个唯一的id
select_typeSELECT关键字对应的那个查询的类型
table表名
partitions匹配的分区信息
type针对单表的访问方法
possible_keys可能用到的索引
key实际上使用的索引
key_len实际使用到的索引长度
ref当使用索引列等值查询时,与索引列进行等值匹配的对象信息
rows预估的需要读取的记录条数
filtered某个表经过搜索条件过滤后剩余记录条数的百分比
Extra一些额外的信息
每一列的含义:

以下都以大家最关心的查询为例。

id

简单来说,每个独立的select都会有一个唯一的id,但是需要注意一下几点:

  • 每一个select会有一个唯一的id,如果查询表后关联了多个表,进行连接查询时,则id相同,但是记录数为多个。
  • 对于包含子查询的语句,每个select会有独立的id,需要注意的是,查询优化器可能会对查询sql进行重写,从子查询转化为连接查询,这样的话,id仍相同。
  • 对于union来说,也会有每个select都会有不同的id,但是从执行计划来看,会多出来一条select_type为union result的类型的记录,id值为空,其作用就是合并每个查询出来的结果集。
select_type

查询包含一下类型:

  • SIMPLE:对于不包含union和子查询的语句都算simple类型。
  • PRIMARY:顾名思义,最主要的,对于union、union all、子查询来说,基准表也就是最左边的查询的表类型就为primary。
  • UNION:对于union的多条查询语句,除了基准表也就是最左边的表,其他都是union类型。
  • UNION RESULT:对于union两段查询结果合并去重后插入临时表,对该临时表查询的类型就是union result。
  • SUBQUERY:将不能转化为semi-join的子查询,并且查询是不相关的子查询,则这个查询类型就是subquery。需要注意的是,这个不相关子查询会被物化,并且只需查询一次。
  • DEPENDENT SUBQUERY:和subquery相似,但是子查询物化后需要被查询多次。
  • DEPENDENT UNION:如何一个查询包含一个子查询,子查询中又包含了union,且该查询与子查询不相关,那么最外层查询类型就为primary,内层子查询最左侧的为dependent subquery,其余的为dependent union。需要注意的是其中的子查询结果集会被查询多次。
  • DERIVED:对于查询采用物化的方式执行的包含派生表的查询,对于派生表对应的对子查询的类型为derived。
  • MATERIALIZED:如果一个查询包含一个子查询,将子查询物化之后,对外层表进行关联时查询的类型为materialized。
  • UNCACHEABLE SUBQUERY:不常用。
  • UNCACHEABLE UNION:不常用。
partitions
  • 分区
type
  • system:当表中只有一条记录并且该表使用的存储引擎的统计数据是精确的,这种类型为system。
  • const:根据主键或者一的二级索引等值匹配查询。
  • eq_ref:被驱动表通过主键或者一二级索引列等值匹配的方式进行访问。
  • ref:当通过普通的二级索引列与常量进行等值匹配时来查询某个表。
  • fulltext:全文索引。
  • ref_or_null:当对普通二级索引进行等值匹配查询,该索引列的值也可以是NULL值时,那么对该表的访问方法就可能是ref_or_null。
  • index_merge:索引合并的方式执行查询。
  • unique_subquery:类似于两表连接中被驱动表的eq_ref访问方法,unique_subquery是针对在一些包含IN子查询的查询语句中,如果查询优化器决定将IN子查询转换为EXISTS子查询,而且子查询可以使用到主键进行等值匹配的话,那么该子查询执行计划的type列的值就是unique_subquery。
  • index_subquery:index_subquery与unique_subquery类似,只不过访问子查询中的表时使用的是普通的索引,
  • range:查询范围区间。
  • index:扫描全部的索引记录。
  • all:全表扫描。

未完待续…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值