热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Explain查询MySQL执行计划

用explain来优化查询explain语句能够提供MySQL执行语句的信息,即语句的执行计划。explain支持的语句有:selectdeleteinsertreplaceupd

用 explain 来优化查询

explain 语句能够提供 MySQL 执行语句的信息,即语句的执行计划

explain 支持的语句有:



  • select

  • delete

  • insert

  • replace

  • update

explain 对 select 语句的输出格式:(官网: https://dev.mysql.com/doc/refman/5.7/en/explain-output.html )



  • id -- 查询的标识符(the select identifier)

  • select_type -- 查询的类型(the select type)

  • table -- 表名(the table for output row)

  • partitions -- 匹配的分区(the matching partitions)

  • type -- 连接类型(the join type)

  • possible_keys -- 可能选择的索引(the possible indexes to choose)

  • key -- 实际选择的索引(the index actually chosen)

  • key_len -- 实际选择的索引的长度(the length of the chosen key)

  • ref -- 与索引比较的列(the columns compared to the index)

  • rows -- 要扫描的估计的行数(estimate of rows to be examined)

  • filtered -- 被表条件过滤的表的估计百分比(percentage of rows filtered by table condition)

  • Extra -- 额外的信息(additional information)


详解 explain 输出的信息

id: 查询的标识符,即查询语句中每个 select 的顺序号。值可以为null,当前行引用的是其它行的并集(union)结果。

select_type: select的类型



  • simple

    • 简单的 select,即没有用 union 或子查询

    • simple select,not using union or subqueries



  • primary

    • 外层 select

    • outermost select



  • union

    • 在一个 union 的第二或后面的 select

    • second or later select statement in a union



  • dependent union

    • 依靠外层查询的第二或后面的 select 在一个 union

    • second or later select statement in a union,dependent on outer query



  • union result

    • 一个 union 的结果

    • result of a union



  • subquery

    • 子查询的第一个 select

    • first select in subquery



  • dependent subquery

    • 依靠外层查询的子查询的第一个 select

    • first select in subquery,dependent on outer query



  • derived

    • 派生表

    • derived table



  • materialized

    • 物化子查询

    • materialized subquery



  • uncacheable subquery

    • 一个子查询,即结果不能被缓存且要外层查询要重新查询

    • a subquery for which the result cannot be cached and must be re-evaluated for each row of the outer query



  • uncacheable union

    • 在一个 union 的第二或后面的 select,属于一个不能缓存的子查询,跟 uncacheable query 一样

    • the second or later select in a union that belongs to an uncacheable subquery(see uncacheable subquery)



table: 表名,即 explain 输出的行所引用的表名,也可以是下面的值:



  • : 即 id 值为 M 和 N 的 union

  • : 即 id 值为 N 的派生表

  • : 即 id 值为 N 的物化子查询

partitions: 匹配的分区,即被查询匹配上的记录所在的分区,表没有分区的话就是 null

type: 连接类型(官网: https://dev.mysql.com/doc/refman/5.7/en/explain-output.html#explain-join-types )



  • system: 只有一条记录的表,这是一种特殊情况

  • const: 在查询开始时读取,表中最多有一个匹配的行记录,即只读一次,所以非常快

    • 用了主键索引唯一索引的列为查询条件,而它的值是常量时,会用到 const

      • 如果其它的查询条件匹配失败,type 则为null,Extra 列中会有: Impossible WHERE noticed after reading const tables





  • eq_ref:

    • 在联表查询中,对上一个表每一行的组合,从当前表中读取一行,而关联条件的字段用的是主键索引唯一索引的列,它的值可以为常量,也可以为关联表的字段。



  • ref:

    • 查询中,用了主键索引唯一索引的列的前缀(就是匹配到的一止一行记录),或者用的是主键索引唯一索引之外的索引。



  • fulltext

    • 联接用的是全文索引执行的



  • ref or null

    • 与 ref 类似,但是mysql会额外扫描包含空值的行。比如:

      select * from ref_table where key_column=exepr or key_column is null;




  • index merge

    • 执行计划用了索引合并优化

      • key 的那一列会展示用到的索引;

      • key_len 的那一列会展示的长度是最长长度的索引的。

        --> 合并的索引比较多,会影响性能,应该考虑加一个联合索引





  • unique subquery

    • 被用 in () 括起来的子查询,子查询是 eq_ref 的 type,其 type 会被替换成 unique subquery



  • index subquery

    • 与 unique subquery 类型,是被用 in () 括起来的子查询,但不同的是子查询中用的索引不是唯一索引



  • range

    • 仅查询给定范围的行记录,且使用了索引;

      • 给定范围的方式包括用: =, <>, >, >=, <, <=, is null, <=>, between, like, in()等。



    • key 的那一列会展示用到的索引;

    • key_len 的那一列会展示的长度是最长长度的索引的。



  • index

    • 跟全表扫描类型,不过是在索引树上扫描,比全表扫描要快。

      • 如果索引是查询的覆盖索引,并且可用于满足表中所需的所有数据,则仅扫描索引树。

        • Extra 列会展示: Using index;



      • 使用从索引中读取的数据执行全表扫描,以按索引顺序查找数据行。





  • all

    • 即全表扫描查询。



小结

1、就查效率来说:system > const > eq_ref > ref > range > index > all
2、index merge 是个坑,因为加太多索引的情况,全并索引的结果会开销比较大,还不如全表扫描。


推荐阅读
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文详细介绍了使用C#实现Word模版打印的方案。包括添加COM引用、新建Word操作类、开启Word进程、加载模版文件等步骤。通过该方案可以实现C#对Word文档的打印功能。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • Python中sys模块的功能及用法详解
    本文详细介绍了Python中sys模块的功能及用法,包括对解释器参数和功能的访问、命令行参数列表、字节顺序指示符、编译模块名称等。同时还介绍了sys模块中的新功能和call_tracing函数的用法。推荐学习《Python教程》以深入了解。 ... [详细]
author-avatar
素材火2
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有