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的输出格式为“”,其中,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:表示使用到了索引 , 并且所取的数据完全在索引中就能拿到
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值