博客
关于我
MySQL 优化:Explain 执行计划详解
阅读量:794 次
发布时间:2023-02-10

本文共 2366 字,大约阅读时间需要 7 分钟。

Explain执行计划详解:理解MySQL SQL优化工具

最近在与技术同事的交流中,提到了一个关于MySQL SQL优化工具的思考过程。作为一个技术工作者,对于数据库性能的优化问题永远都抱有热情。在一次午餐时的讨论中,大牛们提到了一些关于数据库优化的高端技术,让我也想借这个机会深入学习和分享一下。

Explain有什么用?

Explain(解释)是一种MySQL提供的工具,用于分析和优化SQL语句的执行计划。它可以帮助我们深入理解MySQL是如何处理特定SQL查询的,包括连接表的方式、查询类型、索引使用情况、表之间的引用关系等等。对于优化SQL性能,了解Explain的输出是非常重要的。

Explain的输出包含了12个字段,每个字段都提供了不同的信息,帮助我们分析查询的执行情况。这些字段包括id、select_type、table、partitions、type、possible_keys、key、key_len、ref、rows、filtered和Extra。通过理解这些字段的含义,我们可以更好地识别和解决查询性能问题。

Explain执行计划详解

一、id

id字段表示查询中执行select子句或操作表的顺序。id的值越大,代表优先级越高,越先执行。通常,id字段会有三种情况:

  • id相同:表示这些表为一组,具有同样的优先级,执行顺序由优化器决定。
  • id不同:如果查询中存在子查询,id的序号会递增,id值越大优先级越高,越先被执行。
  • 以上两种同时存在:组内的表按id顺序执行,组间的表按id顺序优先级执行。
  • 二、select_type

    select_type字段表示查询的类型,主要用于区分不同的复杂查询类型。常见的类型包括:

  • SIMPLE:表示最简单的select查询,不包含子查询或union操作。
  • PRIMARY:表示最外层的查询,包含了复杂的子部分。
  • SUBQUERY:表示子查询被包含在select或where列表中。
  • DERIVED:表示包含在from子句中的子查询。
  • UNION:表示使用了union操作。
  • UNION RESULT:表示使用了union后的临时表结果。
  • 三、table

    table字段显示查询使用的表名,包括真实存在的表、别名或临时表。例如,在联合查询中,可能会看到类似<union1,4>的表别名。

    四、partitions

    partitions字段显示匹配到的分区信息。如果查询的是分区表,partitions会显示命中的分区情况;否则,值为NULL。

    五、type

    type字段表示查询使用了何种类型,这对于数据库性能评估非常重要。性能从好到坏依次为:system > const > eq_ref > ref > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL。

    六、possible_keys

    possible_keys字段显示MySQL在执行查询时使用的索引列表。这些索引不一定是查询中实际使用的,但可以提供一定的优化信息。

    七、key

    key字段显示查询中实际使用到的索引。如果没有使用索引,值为NULL。

    八、key_len

    key_len字段表示查询用到的索引长度(字节数)。索引长度越短越好。需要注意的是,key_len只计算where条件中使用的索引长度,不包括排序或分组。

    九、ref

    ref字段表示常熟值查询、关联字段或其他字段信息。在常熟值查询中显示const,在关联查询中显示关联字段。

    十、rows

    rows字段显示估算的要读取的行数。rows越小越好,表示查询性能越好。

    十一、filtered

    filtered字段显示符合条件的记录数的百分比。MySQL 5.7版本默认支持显示filtered字段。

    十二、Extra

    Extra字段包含一些无法适合在其他字段中显示的额外信息,包括使用到的索引、where条件、临时表、文件排序等。

    Example分析

    通过具体的SQL示例,我们可以更直观地理解Explain的输出。以下是联合查询的Explain结果分析:

    mysql> EXPLAIN SELECT * FROM one o, two t, three r WHERE o.two_id = t.two_id AND t.three_id = r.three_id;

    分析结果

  • id=1:表示优先级最高的表是one o。
  • select_type=SIMPLE:表示这是一个简单的select查询。
  • table=one:查询的表是one。
  • partitions= NULL:没有匹配到分区。
  • type=ALL:查询方式是全表扫描。
  • possible_keys= NULL:没有使用索引。
  • key= NULL:没有使用索引。
  • key_len= NULL:没有使用索引。
  • ref= NULL:没有使用关联字段。
  • rows=2:估算需要读取2行记录。
  • filtered= NULL:没有过滤条件。
  • Extra=Using where; Using join buffer (Block Nested Loop):使用了where条件和连接缓冲区。
  • 通过以上分析,我们可以看出该查询使用了嵌套连接,且在连接条件中没有使用索引,导致额外的性能开销。

    总结

    Explain是一个强大的工具,能够帮助我们深入理解MySQL对SQL查询的执行过程。了解Explain的输出,我们可以更好地识别和优化查询性能问题。在实际开发中,及时查看Explain结果,对于解决慢查询问题至关重要。如果连执行计划结果都不会看,那还谈什么SQL优化呢?

    转载地址:http://awbfk.baihongyu.com/

    你可能感兴趣的文章
    MySQL-【1】配置
    查看>>
    MySQL-【4】基本操作
    查看>>
    Mysql-丢失更新
    查看>>
    Mysql-事务阻塞
    查看>>
    Mysql-存储引擎
    查看>>
    mysql-开启慢查询&所有操作记录日志
    查看>>
    MySQL-数据目录
    查看>>
    MySQL-数据页的结构
    查看>>
    MySQL-架构篇
    查看>>
    MySQL-索引的分类(聚簇索引、二级索引、联合索引)
    查看>>
    Mysql-触发器及创建触发器失败原因
    查看>>
    MySQL-连接
    查看>>
    mysql-递归查询(二)
    查看>>
    MySQL5.1安装
    查看>>
    mysql5.5和5.6版本间的坑
    查看>>
    mysql5.5最简安装教程
    查看>>
    mysql5.6 TIME,DATETIME,TIMESTAMP
    查看>>
    mysql5.6.21重置数据库的root密码
    查看>>
    Mysql5.6主从复制-基于binlog
    查看>>
    MySQL5.6忘记root密码(win平台)
    查看>>