MySQL中explain输出详解

MySQL中explain输出详解
  1. id列
    id列的序号是select语句的编号,id越大执行的优先级就越高,可能会出现相同id的情况,这时按照id分组,id相同时按照从上到下的顺序执行,如果id为空则最后执行

  2. select_type列
    表示对应数据的查询类型,可能的情况有:

    • simple:不包含子查询和union的简单查询

    • primary:复杂查询中的最外层查询

    • subquery:包含在select中的子查询(不在from子句中)

    • derived:包含在from子句中的子查询,对于这种查询类型,MySQL会将结果集放在一个临时表中,也叫做衍生表

    • union:表示使用union连接后的查询语句,union result表示合并的结果

  3. table列
    表示当前查询访问的是哪张表。当from子句中有子查询时,table的输出格式为“<derivedN>”,其中,N代表id列的值,表示当前语句依赖id=N的查询,所以先执行id=N的语句,如果使用EXPLAIN分析带有子查询的语句table列却没有相似输出,那是因为优化对临时表做了优化,只需要关闭这个优化选项就可以看见了,示例如下

    set session optimizer_switch = 'derived_merge=off'; #关闭优化器对临时表的合并优化
    EXPLAIN SELECT * FROM (SELECT * FROM table_xxx WHERE id = '1580133829666242561') t;
    set session optimizer_switch = 'derived_merge=on'; #执行完开启优化器对临时表的合并优化
    
  4. partitions列
    表示查询数据的分区,对于非分区表,列值为null

  5. type列
    这是比较重要的一列信息,表示关联类型或访问类型,访问效率从高到低分别是 system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL,一般情况下要求SQL达到range级别,甚至是ref

    • ALL:全表扫描
    • index:全索引扫描,主要有两种情况,一是我们需要的数据就在索引中,可以直接获取,二是使用索引进行排序
    • range:表示利用索引查询的时候限制了范围,在指定范围内进行查询,这样避免了index的全索引扫描,适用的操作符: =, <>, >, >=, <, <=, IS NULL, BETWEEN, LIKE, or IN()
    • index_subquery:利用索引来关联子查询,不再扫描全表
    • unique_subquery:该连接类型类似与index_subquery,使用的是唯一索引
    • index_merge:在查询过程中需要多个索引组合使用
    • ref_or_null:对于某个字段即需要关联条件,也需要null值的情况下,查询优化器会选择这种访问方式
    • ref:使用了非唯一性索引进行数据的查找
    • eq_ref :使用唯一性索引进行数据查找
    • const:这个表至多有一个匹配行
    • system:表只有一行记录(等于系统表),这是const类型的特例,平时不会出现
  6. possible_keys列

    显示可能应用在这张表中的索引,一个或多个,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用

  7. key
    实际使用的索引,如果为null,则没有使用索引,查询中若使用了覆盖索引,则该索引和查询的select字段重叠

  8. key_len
    表示索引中使用的字节数,可以通过key_len计算查询中使用的索引长度,在不损失精度的情况下长度越短越好

  9. ref:此列显示key列记录的索引中,表查找值时使用到的列或常量。常见的有const、字段名

  10. rows:此列是MySQL在查询中估计要读取的行数。注意这里不是结果集的行数

  11. filtered:通过过滤条件之后对比总数的百分比

  12. extra:额外信息

    • Using filesort:当Query中包含 order by 操作,而且无法利用索引完成的排序操作称为“文件排序”
    • using temporary:建立临时表来保存中间结果,查询完成之后把临时表删除
    • Using where:不用读取表中所有信息,仅通过索引就可以获取所需数据,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤
    • Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询,常见 group by ; order by
    • Using join buffer:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能
    • Impossible where:这个值强调了where语句会导致没有符合条件的行(通过收集统计信息不可能存在结果)
    • Select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行
    • No tables used:Query语句中使用from dual 或不含任何from子句
    • using index:表示使用到了索引 , 并且所取的数据完全在索引中就能拿到
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

相关阅读更多精彩内容

  • 一条查询语句执行过程 EXPLAIN 基本语法 explain [extended|partition]selec...
    萧格阅读 7,471评论 0 3
  • 一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划,这个执行计划展示了接下...
    tracy_668阅读 3,240评论 0 2
  • 本文主要讲述如何通过 explain 命令获取 select 语句的执行计划,通过 explain 我们可以知道以...
    码农随想录阅读 2,976评论 0 2
  • 一、MYSQL的索引 索引(Index):帮助Mysql高效获取数据的一种数据结构。用于提高查找效率,可以比作字典...
    无声旅者阅读 3,848评论 0 5
  • explain的作用 我们使用explain命令来查看mysql语句的执行计划(execution plan),解...
    EdisonDong阅读 4,719评论 0 0

友情链接更多精彩内容