• ADADADADAD

    分析MySQL EXPLAIN结果集[ mysql数据库 ]

    mysql数据库 时间:2024-11-26 22:13:28

    作者:文/会员上传

    简介:

    EXPLAIN:查看SQL语句的执行计划EXPLAIN命令可以帮助我们深入了解MySQL基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计

    以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。

    EXPLAIN:查看SQL语句的执行计划

    EXPLAIN命令可以帮助我们深入了解MySQL基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用,在优化慢查询时非常有用

    执行explain之后结果集包含如下信息

    +----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------+
    |id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|
    +----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------+

    下面将对每一个值进行解释

    1、id

    id用来标识整个查询中SELELCT语句的顺序,在嵌套查询中id越大的语句越先执行,该值可能为NULL

    id如果相同,从上往下依次执行。id不同,id值越大,执行优先级越高,如果行引用其他行的并集结果,则该值可以为NULL

    2、select_type

    select_type表示查询使用的类型,有下面几种:

    simple:

    列类型长度备注id int4+1int为4bytes,允许为NULL,加1byteid bigint not null8bigint为8bytesuser char(30) utf830*3+1utf8每个字符为3bytes,允许为NULL,加1byteuser varchar(30) not null utf830*3+2utf8每个字符为3bytes,变长数据类型,加2bytesuser varchar(30) utf830*3+2+1utf8每个字符为3bytes,允许为NULL,加1byte,变长数据类型,加2bytesdetail text(10) utf830*3+2+1TEXT截取部分,被视为动态列类型。

    key_len只指示了where中用于条件过滤时被选中的索引列,是不包含order bygroup by这一部分被选中的索引列

    8、ref

    ref列用来显示使用哪个列或常数与key一起从表中选择相应的行。它显示的列的名字(或const),此列多数时候为null

    9、rows

    rows列显示的是mysql解析器认为执行此SQL时必须扫描的行数。此数值为一个预估值,不是具体值,通常比实际值小

    10、filtered

    此参数为mysql 5.7 新加参数,指的是返回结果的行数所占需要读到的行(rows的值)的比例
    对于使用join时,前一个表的结果集大小直接影响了循环的行数

    11、extra(重要)

    extra表示不在其他列并且也很重要的额外信息

    using index:该值表示这个SQL语句使用了覆盖索引(覆盖索引是指可以直接在索引列中得到想要的结果,而不用去回表),此时效率最高

    mysql>explainselectidfromtest;
    +----+-------------+-------+-------+---------------+----------+---------+------+-------+-------------+
    |id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra|
    +----+-------------+-------+-------+---------------+----------+---------+------+-------+-------------+
    |1|SIMPLE|test|index|NULL|idx_bnet|9|NULL|68505|Usingindex|
    +----+-------------+-------+-------+---------------+----------+---------+------+-------+-------------+

    这个例子中id字段为主键,但是key那里显示走的并不是主键索引,这个是因为mysql的所有二级索引中都会包含所有的主键信息,而mysql没有单独的存储主键索引,所以扫描二级索引的开销比全表扫描更快

    using where:表示存储引擎搜到记录后进行了后过滤(POST-FILTER),如果查询未能使用索引,using where的作用只是提醒我们mysql要用where条件过滤结果集

    mysql>explainselect*fromtestwhereid>1;
    +----+-------------+-------+-------+---------------+---------+---------+------+-------+-------------+
    |id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra|
    +----+-------------+-------+-------+---------------+---------+---------+------+-------+-------------+
    |1|SIMPLE|test|range|PRIMARY|PRIMARY|8|NULL|34252|Usingwhere|
    +----+-------------+-------+-------+---------------+---------+---------+------+-------+-------------+

    using temporary表示mysql需要使用临时表来存储结果集,常见于排序和分组查询

    mysql>explainselect*fromtestwhereidin(1,2)groupbybnet_id;
    +----+-------------+-------+-------+-----------------------------------------+---------+---------+------+------+----------------------------------------------+
    |id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra|
    +----+-------------+-------+-------+-----------------------------------------+---------+---------+------+------+----------------------------------------------+
    |1|SIMPLE|test|range|PRIMARY,IDX(event_key-bnet_Id),idx_bnet|PRIMARY|8|NULL|2|Usingwhere;Usingtemporary;Usingfilesort|
    +----+-------------+-------+-------+-----------------------------------------+---------+---------+------+------+----------------------------------------------+

    using filesort:是指mysql无法利用索引直接完成排序(排序的字段不是索引字段),此时会用到缓冲空间来进行排序

    mysql>explainselect*fromtestorderbybnet_id;
    +----+-------------+-------+------+---------------+------+---------+------+-------+----------------+
    |id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra|
    +----+-------------+-------+------+---------------+------+---------+------+-------+----------------+
    |1|SIMPLE|test|ALL|NULL|NULL|NULL|NULL|68505|Usingfilesort|
    +----+-------------+-------+------+---------------+------+---------+------+-------+----------------+

    using join buffer:强调在获取连接条件时没有用到索引,并且需要连接缓冲区来存储中间结果。(性能可以通过添加索引或者修改连接字段改进)

    mysql>explainselect*fromtestleftjointest2ontest.create_time=test2.create_time;
    +----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+----------------------------------------------------+
    |id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|
    +----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+----------------------------------------------------+
    |1|SIMPLE|test|NULL|ALL|NULL|NULL|NULL|NULL|959692|100.00|NULL|
    |1|SIMPLE|test2|NULL|ALL|NULL|NULL|NULL|NULL|958353|100.00|Usingwhere;Usingjoinbuffer(BlockNestedLoop)|
    +----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+----------------------------------------------------+
    2rowsinset,1warning(0.00sec)

    Block Nested Loop是指Block Nested-Loop Join算法:将外层循环的行/结果集存入join buffer, 内层循环的每一行与整个buffer中的记录做比较,从而减少内层循环的次数.

    impossible where:表示where条件导致没有返回的行

    mysql>explainselect*fromtestwhereidisnull;
    +----+-------------+-------+------+---------------+------+---------+------+------+------------------+
    |id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra|
    +----+-------------+-------+------+---------------+------+---------+------+------+------------------+
    |1|SIMPLE|NULL|NULL|NULL|NULL|NULL|NULL|NULL|ImpossibleWHERE|
    +----+-------------+-------+------+---------------+------+---------+------+------+------------------+

    using index condition:是mysql 5.6 之后新加的特性,结合mysql的ICP(Index Condition Pushdown)特性使用。主要是优化了可以在索引(仅限二级索引)上进行 like 查找

    如果extra中出现多个上面结果,则表示顺序使用上面的方法进行解析查询

    分析MySQL EXPLAIN结果集.docx

    将本文的Word文档下载到电脑

    推荐度:

    下载
    热门标签: explainmysql