美文网首页
MySQL执行计划

MySQL执行计划

作者: 森林中大鸟 | 来源:发表于2020-08-21 18:45 被阅读0次

    id 表的读取顺序

    执行优先级,id相同从上到下依次执行,id不同,id从大到小依次执行

    select_type 查询类型

    simple 简单查询,不包含子查询,union

    primary 最外层的查询 ,鸡蛋壳,查询中包含任何复杂的子查询时,最外层的查询。

    subquery 在select 或 where中包含的子查询

    derived 在from中包含的子查询被标记为derived(衍生)MySQL会递归的执行这些子查询,把结果放在临时表。derived后的数字即为id

    union 若第二个select 出现在union之后则被标记位union;若union包含在from子句的查询中,外层select 被标记未derived;

    union result 两个union合并的结果集

    type

    从最好到最差
    system 》 const 》 eq_ref》 ref 》 range 》 index 》all

    • system
      单表单行记录,等价于系统表

    • const
      表示通过索引一次找到了记录,const用于比较主键列或唯一索引列,索引很快,如果主键置于where中,MySQL就可以把该查寻替换为一个常量。

    • eq_ref
      唯一性索引扫描,对于每个索引键,表中只有一条记录与之对应
      select * from t1,t2 where t1.id=t2.id

    • ref
      非为一性索引扫描, 返回返回匹配某个单独值的所有行;
      select * from t where col = ’s';

    • range
      只检索给定范围的行key显示用了那和索引,一般是在where中出现了范围查询,它开始于索引的一点,结束语索引的另一个点,比全表扫描快。
      select * from t where id between 1 and 10;

    • index
      Full index scan 全索引扫描
      index和all的区别为index只遍历索引树,通常比all快,因为索引文件更小。都是都全表。
      select id from t1;

    • all
      全表扫描;

    possible keys

    可能用到的索引。

    key

    实际用到的索引,为null 表示没有用到索引。或者没建立索引
    拆卸像那种若使用到了覆盖索引,则该索引只出现在key这一列中;

    key_len

    表示索引中使用到的字节数,可通过该列计算查询寻中使用到额索引的长度,再不损失精度的情况下,用的越少越好。
    显示的值为索引字段的最大长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。
    比如:col1 列 索引长度13,col2 列 索引长度13 where col1 = ‘ss’ key_len = 13 where col1 = 'a' and col2 ='s' key_len = 26

    ref

    type 为 ref/eq_ref 时
    显示哪一列被使用了,如果可能的话,最好是一个常数。
    库.表.字段 const

    rows

    根据表统计信息和索引使用情况,大致估算出找到所需记录所需要读取的行数

    filterd

    过滤掉了多少行

    extra

    • using filesort 需要优化
      说明 MySQL会对数据使用一个外部的索引排序, 而不是按照表内的索引顺序进行读取。MySQL中无法使用索引完成的排序操作成为文件排序。
    • using tempory 必须优化
      使用了临时表保存中间结果,MySQL对查询结果排序时使用临时表,常见于order by group by
    • using index 覆盖索引(查询的列被所建的索引覆盖)
      表明使用了发覆盖索引,避免访问数据行(回表)
      如果出现了using where 说明索引被用来执行索引键值的查找;
      如果没有using where 说明索引直接用来读取数据。
    • using where
      表明使用了where 过滤
    • using join buffer
      使用了连接缓存,
    • impossible where
      where 子句的值总是false,不能用来获取元素。
      where id= 1 and id = 3;
    • select tables optmized away
      没有group by 子句的情况下,基于索引min/max操作或者对于myisam存储疫情优化count(*),不必等到执行阶段计算,查询执行计划生成的阶段即可完成优化。
    • distinct
      找到第一个匹配的时候就返回。

    相关文章

      网友评论

          本文标题:MySQL执行计划

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