MySQL执行计划

2021/10/23 2:09:31

本文主要是介绍MySQL执行计划,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、MySQL执行计划

在MySQL中可以通过explain关键字模拟优化器执行SQL语句,从而知道MySQL是
如何处理SQL语句的。

二、MySQL整个查询执行过程

  • 客户端向MySQL服务器发送一条查询请求
  • 服务器首先检查查询缓存(看下缓存中是否有该查询语句的执行计划),如果命中缓存,则立刻返回存储在缓存中的结果(这个过程叫软解析,当表执行更新或者表结构发生改变会删除缓存)。否则进入下一阶段
  • 服务器进行SQL解析(先执行语法检查,然后再执行语意检查查看对象是否存在)、预处理(优化处理)、再由优化器生成对应的执行计划
  • MySQL根据执行计划,调用存储引擎的API来执行查询
  • 将结果返回给客户端,同时缓存查询结果

三、启动执行计划

explain select 投影列 from 表名 where 条件

四、explain 列的解析

  • ID:
    查询执行顺序:
    id值相同时表示从上向下执行
    id值相同被视为一组
    如果是子查询,id 值会递增,id 值越高,优先级越高
  • select_tepy:
    simple:表示查询中不包含子查询或者union
    primary:当查询中包含任何复杂的子部分,最外层的查询被标记成primary
    derived:在from的列表中包含的子查询被标记成derived
    subquery:在select或where列表中包含了子查询,则子查询被标记成subquery
    union:两个select查询时前一个标记为PRIMARY,后一个标记为UNION。union 出现
    在from从句子查询中,外层select标记为PIRMARY, union中第一个查 询为DERIVED,
    第二个子查询标记为UNION
    unionresult:从union表获取结果的select 被标记成union result
  • table:
    显示这一行的数据是关于哪张表的。

  • type:
    这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为system、const、eq_reg、 ref、 range、 index和ALL.
    1、system:表中只有一-行数据。属于const的特例。如果物理表中就一行数据为ALL。
    2、const: 查询结果最多有一个匹配行。因为只有一行,所以可以被视为常量。const查询速度非常快,因为只读一次。一般情况下把主键或唯一索引作为唯一条件的查询都是const
    3、eq_ ref:查询时查询外键表全部数据。且只能查询主键列或关联列。且外键表中外键列中数据不能有重复数据,且这些数据都必须在主键表中有对应数据(主键表中数据可以有没有用到的) .
    4、ref:相比eq_ref, 不对外键列有强制要求,里面的数据可以重复,只要出现重复的数据取值就是ref。也可能是索引查询。
    5、range:把这个列当作条件只检索其中一个范围。常见where从句中出现between、<、in等。主要应用在具有索引的列中
    6、index:这个连接类型对前面的表中的每一个记录联合进行完全扫描 (比ALL更好,因为索引一般小于表数据)。
    7、ALL:全盘扫描,这个连接类型对于前面的每-一个记录联合进行完全扫描,这一般比较糟糕, 应该尽量避免。
  • possible_ keys:
    查询条件字段涉及到的索引,可能没有使用。

  • Key:
    实际使用的索引。如果为NULL,则没有使用索引。
  • Key_len:
    表示索引中使用的字节数,查询中使用的索引的长度(最大可能长度),并非实际使用
    长度,理论上长度越短越好。key _len是根据表定义计算而得的,不是通过表内检索出的。

  • ref:
    显示索引的哪一列被使用了, 如果可能的话,是一个常量const。

  • rows:
    根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数。

  • Fitered:
    显示了通过条件过滤出的行数的百分比估计值。

  • extra:
    查询的额外信息:
    1、Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
    2、Not exists:MySQL能够对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,不再为前面的的行组合在该表内检查更多的行。
    3、range checked for each record (index map: #):MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。
    4、Using filesort:MySQL需要额外的一次传递,以找出如何按排序顺序检索行。
    5、Usingindex:从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。
    6、Using temporary:为了解决查询,MySQL需要创建一个临时表来容纳结果。
    7、Using where:WHERE子句用于限制哪个一行匹配下一个表或发送到客户。
    8、Using sort_ union(...)、 Using union(...)、Using intersec(...):这些函数说明如何为index_ merge联接类型合并索引扫描。
    9、Using index for group-by:类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。


这篇关于MySQL执行计划的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程