MySQL explain详解

前言

MySQL提供explain关键字为我们提供语句SQL如何执行的信息,explain可用于 select,delete,insert,replace和update语句前。
select语句之前增加explain关键字,MySQL会在查询上设置一个标记,使语句执行时只会返回select语句的执行计划,但不执行select语句,使开发者可以根据执行计划开发者可特定策略提高SQL语句性能。该文主要参考自MySQL官方文档EXPLAIN Output Format。

explain返回结果列解析

  • id:标识SQL中的select执行顺序
    • id相同时,查询语句从上往下查询
    • id不同时,id越大的执行优先级越高
  • select_type:查询类型
    类型说明
    SIMPLE(常见)简单查询,在当今数据量爆炸、单表操作常见的时代只需了解该类型即可
    PRIMARY包含union或者子查询,最外层查询语句类型标记为primary
    SUBQUERY在SELECT或where列表中的子查询
    UNIONunion关键字后的查询都被标记为UNION
    DERIVED派生表,from后的子查询,如select * from (select …)
    MATERIALIZED物化子查询,出现在 in (select … where)子查询条件没有索引的情况
  • table:执行的select查到是哪个表
  • partitions:查询将匹配记录的分区
  • type(access_type,重点):访问(连接)类型,表示获取所需数据行的方式
    类型说明效率
    system该表只有一行(=系统表),这是const防伪标类型的特例。S+
    const表中最多具有一个匹配行,当使用主键或唯一索引字段进行=判断时使用。S
    eq_ref表间连接使用等值比较的列索引为主键或唯一非空索引时(如user_base join user_detail on user_base.id=user_detail.user_id 或 where user_base.id = user_detail.user_id,a.id为主键索引)使用该类型访问数据A
    ref使用=或<=>(注:<=>其实就是=,不是<或>或=)运算符进行条件比较普通索引列时使用该类型,如where user_id=1,user_id为普通索引B
    fulltext使用FULLTEXT 索引执行联接C
    ref_or_null与ref类似,只是条件多出了is null判断,如col=1 or col is nullD
    index_merge索引合并优化,仅合并来自单个表的索引扫描,而不合并多个表的扫描,possible_keys列出现可能使用的索引数组。如explain select * from user_detail where (city = ‘火星’ or user_id = 21),city与user_id都有索引,Mysql将进行合并优化E
    unique_subquery(少用可忽略)一个索引查找函数,替代某些in子查询以提高效率。F
    index_subquery(少用可忽略)类似于 unique_subquery,用于某些形式下的in子查询中的非唯一索引G
    rangewhere条件范围查询索引列H
    index全索引扫描,只扫描索引树而不扫描数据树I
    ALL全表扫描,该考虑条件索引了渣渣
  • possible_keys:查询中可能会被使用的索引
  • key:实际使用的索引

    注:key会命名possible_keys中不存在的索引

  • key_len:实际使用的索引列长度(如int列索引长度为4)

    若索引列允许NULL值,则该索引列长度比NOT NULL长度大1,如int类型索引列可空则使用该索引时key_len=5。varchar与char的实际长度会根据编码类型更改,在utf8编码环境下实际长度+2,可参考如下2图:
    key_len_null.png
    key_len_not_null.png

  • ref(不常用):将哪些列或常量与该key列中命名的索引进行比较,以从表中选择行。

    当为索引列等值判断时该值为const;当为表间连接时则值为连接字段;当值为func,则使用的值是某些函数的结果,比较失败则为null。

  • rows:MySQL认为执行查询必须检查的行数

    InnoDB引擎下,该数值只是估计值,不一定准确

  • filtered:将按表条件筛选的表行的估计百分比

    最大值为100,意味着没有发生行过滤(即都符合条件),值从100减少表示过滤量增加。如列rows=3,filtered=66.7%,则最后查询出的列数约为2行,如(user_detail全量数据):
    filtered_rows.png
    explain结果3 * 66.67约为2,如下图(实际并不一定准确):
    filtered_rows_explain.png

  • Extra:有关MySQL如何解析查询的额外信息

    常见的如Using Where、Using Index、Distinct等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值