using where 意味着通过索引或者表扫描的方式进程where条件的过滤,
反过来说,也就是没有可用的索引查找,当然这里也要考虑索引扫描+回表与表扫描的代价。
这里的type都是all,说明MySQL认为全表扫描是一种比较低的代价。
Using index condition
1,-- 查询的列不全在索引中,where条件中是一个前导列的范围
2,查询列不完全被索引覆盖,查询条件完全可以使用到索引(进行索引查找)
参考: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
查询2
查询3(逻辑上等价于查询1+查询2),执行计划发生了很大的变化。
总结:
MySQL执行计划中的Extra中信息非常多,不仅仅包括Using index,Using where Using index,Using index condition��Using where,尤其是在多表连接的时候,这一点在相对MSSQL来说,不够直观或者结构化。
MSSQL中是通过区分索引查找(index seek),索引扫描(index scan),表扫描(table scan)来实现具体的查询的,这图形化的执行计划在不同的场景下是非常直观的,要想完全弄懂MySQL的这个执行计划,可能要更多地在实践中摸索。