MySQL执行计划extra中的using index 和 using where using(2)

  using where 意味着通过索引或者表扫描的方式进程where条件的过滤,
  反过来说,也就是没有可用的索引查找,当然这里也要考虑索引扫描+回表与表扫描的代价。
  这里的type都是all,说明MySQL认为全表扫描是一种比较低的代价。

 Using index condition

  1,-- 查询的列不全在索引中,where条件中是一个前导列的范围

  

MySQL执行计划extra中的using index 和 using where using

  2,查询列不完全被索引覆盖,查询条件完全可以使用到索引(进行索引查找)

  

MySQL执行计划extra中的using index 和 using where using

  参考:MySQL · 特性分析 · Index Condition Pushdown (ICP)

  多表关联的时候Using index condition出现的情况更多,目前还不怎么理解Using index condition的内部实现模式。

结论:
  1,Extra中的为Using index的情况
    where筛选列是索引的前导列 &&查询列被索引覆盖 && where筛选条件是一个基于索引前导列的查询,意味着通过索引超找就能直接找到符合条件的数据,并且无须回表

  2,Extra中的为空的情况
    查询列存在未被索引覆盖&&where筛选列是索引的前导列,意味着通过索引超找并且通过“回表”来找到未被索引覆盖的字段,

3,Extra中的为Using where Using index:
  出现Using where Using index意味着是通过索引扫描(或者表扫描)来实现sql语句执行的,即便是索引前导列的索引范围查找也有一点范围扫描的动作,不管是前非索引前导列引起的,还是非索引列查询引起的。

尚未解决的问题:

     查询1

MySQL执行计划extra中的using index 和 using where using

查询2

MySQL执行计划extra中的using index 和 using where using

    查询3(逻辑上等价于查询1+查询2),执行计划发生了很大的变化。

MySQL执行计划extra中的using index 和 using where using

总结:

  MySQL执行计划中的Extra中信息非常多,不仅仅包括Using index,Using where Using index,Using index condition��Using where,尤其是在多表连接的时候,这一点在相对MSSQL来说,不够直观或者结构化。
  MSSQL中是通过区分索引查找(index seek),索引扫描(index scan),表扫描(table scan)来实现具体的查询的,这图形化的执行计划在不同的场景下是非常直观的,要想完全弄懂MySQL的这个执行计划,可能要更多地在实践中摸索。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/47838e15d088f0fd4a15c56558c8bfdb.html