美文网首页
MySQL explain

MySQL explain

作者: 黄二的NPE | 来源:发表于2018-07-07 20:53 被阅读0次

    我们已经用开启了slow_query_log的方式找到慢SQL以后,接下来就是explain登场的时候了。

    • explain的作用

    1. 使用 explain关键字可以让你知道MySQL是如何处理你的SQL语句的。
    2. 这可以帮你分析你的查询语句或是表结构的性能瓶颈。
    3. EXPLAIN 的查询结果还会告诉你你的索引主键被如何利用的,你的数据表是如何被搜索和排序的
    • 举个栗子

    explain select anchor.uid,anchor.nickname,anchor_room.showtime from anchor, anchor_room where anchor.uid = anchor_room.uid and anchor_room.is_lock = 1;

    id select_type table type possible_keys key key_len ref rows Extra
    1 SIMPLE anchor ALL A_UID_INDEX null null null 161381 Using where
    1 SIMPLE anchor_room ref AR_UID_INDEX AR_UID_INDEX 99 qf_user_db.anchor.uid 1 Using where
    • 字段解释

    id

    SQL标识符,查询的表的执行顺序,上面两个表因为都是1,所以都是同时查询的。

    select_type

    查询的类型,主要是区别普通查询和联合查询、子查询之类的复杂查询。

    1. simple 简单查询,只在一个表中的查询,不需要连接别的表
    2. primary 指最外面的查询
    3. subquery 子查询
    4. DERIVED 指这个表是虚拟的,是派生表, 指from里面的东西
    table

    指输出的行所引用的表;有时候它不是一个真实的表,这时候就用derived来表示模拟表

    type

    联合查询所使用的类型,从最好到最坏的顺序为 system,const、eq_reg、ref、range、indexhe和ALL (或者可以理解成搜索表的大小)

    1. system : 是const连接的一个特例,表示在被联合查询的表中只有一个可以被联合查询的行( 被查询的表只有一个行 )
    2. const : 当where出现 = 查找的时候 , = 号是唯一索引列, = 号只能找到一个行
    3. ref : 当where出现 = 查找的时候 , = 号是普通索引列,注意 = 号可能找到多个行
    4. range : 当where的索引列出现 >或者 < 等非等值查找的时候,就是这种type
    5. all : 当 where操作的不是索引列又或者虽然是索引列,但是实际上还是要全表扫描,就要用这个。
    6. index : 该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。
    possible_keys

    显示查询使用了哪些索引,表示该索引可以进行高效地查找,但是列出来的索引对于后续优化过程可能是没有用的。

    key

    显示MySQL实际决定使用的索引列。

    key_len

    显示MySQL决定使用的索引的长度(索引列的字节数),在不损失精确性的情况下,长度越短越好

    ref

    ref列显示使用哪个列或常数与key一起从表中选择行。

    rows

    rows列显示MySQL认为它执行查询时必须检查的行数。注意这是一个预估值。

    filtered

    使用explain extended时会出现这个列,5.7之后的版本默认就有这个字段,不需要使用explain extended了。这个字段表示存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例,注意是百分比,不是具体记录数。

    Extra

    Extra是EXPLAIN输出中另外一个很重要的列,该列显示MySQL在查询过程中的一些详细信息,MySQL查询优化器执行查询的过程中对查询计划的重要补充信息。注意using filesort和using temporary。

    1. distinct:在select部分使用了distinc关键字
    2. no tables used:不带from字句的查询或者From dual查询
    3. 使用not in()形式子查询或not exists运算符的连接查询,这种叫做反连接。即,一般连接查询是先查询内表,再查询外表,反连接就是先查询外表,再查询内表。
    4. using filesort:排序时无法使用到索引时,就会出现这个。常见于order by和group by语句中
    5. using index:查询时不需要回表查询,直接通过索引就可以获取查询的数据。
    6. using join buffer(block nested loop),using join buffer(batched key accss):5.6.x之后的版本优化关联查询的BNL,BKA特性。主要是减少内表的循环数量以及比较顺序地扫描查询。
    7. using sort_union,using_union,using intersect,using sort_intersection:
      using intersect:表示使用and的各个索引的条件时,该信息表示是从处理结果获取交集
      using union:表示使用or连接各个使用索引的条件时,该信息表示从处理结果获取并集
      using sort_union和using sort_intersection:与前面两个对应的类似,只是他们是出现在用and和or查询信息量大时,先查询主键,然后进行排序合并后,才能读取记录并返回。
    8. using temporary:表示使用了临时表存储中间结果。临时表可以是内存临时表和磁盘临时表,执行计划中看不出来,需要查看status变量,used_tmp_table,used_tmp_disk_table才能看出来。
    9. using where:表示存储引擎返回的记录并不是所有的都满足查询条件,需要在server层进行过滤。查询条件中分为限制条件和检查条件,5.6之前,存储引擎只能根据限制条件扫描数据并返回,然后server层根据检查条件进行过滤再返回真正符合查询的数据。5.6.x之后支持ICP特性,可以把检查条件也下推到存储引擎层,不符合检查条件和限制条件的数据,直接不读取,这样就大大减少了存储引擎扫描的记录数量。extra列显示using index condition
    10. firstmatch(tb_name):5.6.x开始引入的优化子查询的新特性之一,常见于where字句含有in()类型的子查询。如果内表的数据量比较大,就可能出现这个
    11. loosescan(m..n):5.6.x之后引入的优化子查询的新特性之一,在in()类型的子查询中,子查询返回的可能有重复记录时,就可能出现这个

    相关文章

      网友评论

          本文标题:MySQL explain

          本文链接:https://www.haomeiwen.com/subject/wheguftx.html