MySQL_执行计划详细说明


阅读目录(Content)

  • 1 简要说明
  • 2 SELECT_TYPE
  • 2 TYPE
  • 3 ref
  • 4 extra    
      回到顶部(go to top)回到顶部(go to top)回到顶部(go to top)const join type.
  • join type 为const,并且表格仅含有1行记录。
  • const
    • 主键或者唯一索引的常量查询,表格最多只有1行记录符合查询,通常const使用到主键或者唯一索引进行定值查询。
    • 常量查询非常快。
  • ref
    • 非聚集索引的常量查询
    • 性能也是很不错的。
  • unique subquery
    • eq_ref的一个分支,查询主键的子查询:
    • value IN (SELECT primary_key FROM single_table WHERE some_expr)
    • 暂时无法模拟出来,目前在5.7.17版本怎么测试,出来的type都是 eq_ref
  • index subquery
    • ref的一个分支,查询非聚集索引的子查询:
    • value IN (SELECT key_column FROM single_table WHERE some_expr)
    • 暂时无法模拟出来,目前在5.7.17版本怎么测试,出来的type都是 ref
  • range
    • 当谓词使用到索引范围查询的时候:=、<>、>、>=、<、<=、IS NULL、BETWEEN、IN、<=> (这是个表达式:左边可以推出右边,右边也可推出左边)
  • index
    • 使用到索引,但是不是索引查找,而是对索引树做一个扫描,即使是索引扫描,大多数情况下也是比全表扫描性能要好的,因为索引树上的键值只有索引列键值+主键,而全表扫描则是在 聚集索引树(主键+所有列)上进行扫描,索引树相比之下要廋得多跟小得多了。
  • 回到顶部(go to top)回到顶部(go to top)

    4 extra    

    • 常用到
      1. Using index,使用到索引
      2. Using index conditio,使用到索引过滤
      3. Using MRR,使用到索引内部排序
      4. Using where,使用到where条件
      5. Using temporary,使用到临时表
    1. Using index
      • 索引覆盖,也就是不止要使用到索引,而且没有回表查询
      • 举个例子说明
      • 这两个查询中,条件都是一样,但是第一个返回的是所有列,而索引 IX_age上仅包含主键列跟索引键值,故需要再根据主键的值去PK树上找到对应的列,这个操作称为回表,所以第一个查询中extra没有USING INDEX,而第二个查询有。
    2. Using index conditio,简称 ICP
    3. Using MRR,简称 MRR
    4. Using where
      • 根据where条件,先取出数据,再跟其他表格关联查询
    5. Using filesort,无法利用索引来完成的排序
    6. Using temporary,使用到临时表
    7. 使用到临时表,表数量较少的情况下,临时表使用缓存,但是比较大的时候,则会磁盘存储,这种情况下,性能将会急剧下降