Mysql explain详解

目录

 

mysql Explain详解

explain声明

explain列说明

          id

          select_type

         table

         type

        possible_keys

        key

        key_len

        ref

        rows

        extra

        partitions


mysql Explain详解

explain声明

  DESCRIBE和 EXPLAIN语句是同义词。实际上,DESCRIBE关键字通常用于获取有关表结构的信息,而EXPLAIN用于获取查询执行计划(即,有关MySQL如何执行查询的说明)

  EXPLAIN语句提供有关MySQL如何执行语句的信息。 EXPLAIN可作用于SELECT, DELETE, INSERT, REPLACE,和 UPDATE语句

explain列说明

          id

              SELECT标识符,id列越大,执行优先级越高,id相同则从上往下执行,id为null,则最后执行有几个select关键字就有几个id

          select_type

                     SELECT类型,表示对应行是简单查询还是复杂查询

                列举所有的字段值:

                         SIMPLE:简单查询,查询语句不包含子查询与union

                         PRIMARY:复杂查询最外层的select,在主select关键字后

                         SUBQUERY:包含在select中的子查询(不在from子句中),在select关键字后

                         DERIVED:临时表,衍生表,在from关键字后

                         UNION:查询语句使用了union

                         DEPENDENT UNION:第二个或更高版本的select语句union,取决于外部查询

                         UNION RESULT:结果union

                         DEPENDENT SUBQUERY:首个select在子查询中,取决于外部查询

                         MATERIALIZED:被物化的子查询

                         UNCACHEABLE SUBQUERY:子查询,其结果无法缓存,必须针对外部查询的每一行重新进行评估

                         UNCACHEABLE UNION:不可缓存子查询的中的第二个或更高版本的选择

 

         table

                     输出表所引用的表的名称,查询的是哪一张表

         type

                    联结类型,表示关联类型或者访问类型,一般至少保证达到range级别,最好达到ref级别

                    主要类型访问速度:system > const > eq_ref > ref > range > index > all

              列举所有的字段值:

                    null:mysql在优化阶段分解查询语句,在执行阶段用不着在访问表或索引,例如:在索引中选取索引最小值,可以单独查找索引,不需要在执行时访问表

                    system:系统表,const联接类型的特例

                    const:条件为主键,且查询结果只有一条数据

                    eq_ref: 唯一索引的所有部分被连接使用,且最多返回一条符合条件的记录,简单的select类型不会出现这种type

                    ref: 相比eq_ref,不使用唯一索引,而是使用普通索引或者唯一索引的前一部分前缀,可以出现多个匹配行

                    range: 范围使用索引查询

                    index: 一般扫描某个二级索引,不会从索引树根节点开始快速查找,而是直接对索引的叶子节点遍历和扫描,速度较慢,这种查询一般为覆盖索引,二级索引一般较小,所以这种通常比all快一点

                    all: 全表扫描,扫描你的聚簇索引的所有叶子节点

                    fulltext: 使用FULLTEXT 索引执行联接

                    ref or null: 此连接类型类似于 ref,但是除了MySQL对包含NULL值的行进行了额外的搜索之外。此联接类型优化最常用于解析子查询

                    index merge: 此联接类型指示使用索引合并优化。在这种情况下,key输出行中的列包含所用索引的列表,并key_len包含所用索引 的最长键部分的列表

                    unique subquery: unique subquery只是一个索引查找函数,它完全替代了子查询以提高效率

                    index subquery: 此连接类型类似于 unique subquery 。它替代IN子查询,但适用于以下形式的子查询中的非唯一索引

        possible_keys

                    可能使用到哪些索引会出现两种情况:1. possible_key有列,而key显示null的情况,就是因为表中数据不多,使用索引查找帮助不是很大,所以选择全表

                                                                                 2. 如果possible_key为null,则没有相关的索引,通常可以创建一个适当的索引来提高查询性能

        key

                   这一列显示mysql实际采用哪个索引来优化该表的访问,如果mysql没有使用索引,可以强制使用force index,ignore index

        key_len

                 key_len越小,索引效果越好,这一列显示mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的那些列, 如果该key列显示 NULL,则该key_len 列也显示NULL。由于密钥存储格式的原因,可以使用的列的密钥长度NULL 比使用NOT NULL列的密钥长度大一。

            key_len计算规则:

                    char(n):如果存汉字长度就是 3n 字节

                    varchar(n):如果存汉字则长度是 3n + 2 字节,加的2字节用来存储字符串长度,因为varchar是变长字符串

             数值类型

                    tinyint:1字节

                    smallint:2字节

                    int:4字节

                    bigint:8字节

            时间类型

                    date:3字节

                    timestamp:4字节

                    datetime:8字节

           如果字段允许为 NULL,需要1字节记录是否为 NULL

        ref

                 这一列显示key记录中的索引,表查找值所用到的列或常量,常见的有:const(常量),字段名(film.id)

        rows

                 这一列是mysql估计要读取并检测的行数,注意这个不是结果集里的实际行数

        extra

                显示额外信息

          常用的字段值:

                  Using index:使用索引覆盖

                  Using where:使用where语句来处理结果并且查询的列未被索引覆盖

                  Using index condition:查询的列不完全被索引覆盖,where条件是一个前导列的范围

                  Using temporary: mysql需要创建一张临时表来处理查询,出现这种情况一般是需要优化的,首先需要想到索引优化

                  Using filesort:使用外部排序而不是索引排序数据较小时从内存排序,否则需要在磁盘中完成排序,这种情况一般考虑使用索引优化

                  Select tables optimized away:使用某些聚合函数(比如max,min)来访问存在索引的某个字段

              索引覆盖整个查询结果只通过辅助索引就能拿到结果,不需要通过辅助索引数找到主键,再通过主键去主键索引树里获取其他的字段值(不需要进行回表操作)

        partitions

                   查询将从中匹配记录的分区。该值适用NULL的未分区的表

 

下一篇 mysql优化

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值