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:查询类型


MySQL explain详解

table:执行的select查到是哪个表

partitions:查询将匹配记录的分区

type(access_type,重点):访问(连接)类型,表示获取所需数据行的方式

MySQL explain详解

  • possible_keys:查询中可能会被使用的索引
  • key:实际使用的索引
  • 注:key可能会命中possible_keys中不存在的索引

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

    MySQL explain详解

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

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

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

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

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

    最大值为100,意味着没有发生行过滤(即都符合条件),值从100减少表示过滤量增加。如列rows=3,filtered=66.7%,则最后查询出的列数约为2行,如(user_detail全量数据):

    MySQL explain详解


    explain结果3 * 66.67约为2,如下图(实际并不一定准确):

    MySQL explain详解

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

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

    explain只返回执行计划不执行语句逻辑

    MySQL通过B+Tree查找规则找到数据所在的叶子页获取相关的Page Header、Page Dicectory等,便可得知所需数据大概有多少条,具体可参考 。如有错误,还请指出;如有不懂,以下参考:

    MySQL explain详解


    分享到:


    相關文章: