博客
关于我
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/

    你可能感兴趣的文章
    mxGraph改变图形大小重置overlay位置
    查看>>
    MongoDB学习笔记(8)--索引及优化索引
    查看>>
    MQTT工作笔记0009---订阅主题和订阅确认
    查看>>
    ms sql server 2008 sp2更新异常
    查看>>
    MS UC 2013-0-Prepare Tool
    查看>>
    msbuild发布web应用程序
    查看>>
    MSB与LSB
    查看>>
    MSCRM调用外部JS文件
    查看>>
    MSCRM调用外部JS文件
    查看>>
    MSEdgeDriver (Chromium) 不适用于版本 >= 79.0.313 (Canary)
    查看>>
    MsEdgeTTS开源项目使用教程
    查看>>
    msf
    查看>>
    MSSQL数据库查询优化(一)
    查看>>
    MSSQL日期格式转换函数(使用CONVERT)
    查看>>
    MSTP多生成树协议(第二课)
    查看>>
    MSTP是什么?有哪些专有名词?
    查看>>
    Mstsc 远程桌面链接 And 网络映射
    查看>>
    Myeclipse常用快捷键
    查看>>
    MyEclipse用(JDBC)连接SQL出现的问题~
    查看>>
    myeclipse的新建severlet不见解决方法
    查看>>