在用explain对select语句进行执行计划分析时,我们常常会其中的Extra字段中出现Using index或Using index;Using where或Using where或Using index condition,那么这四者有什么区别呢?哪个检索的性能更好呢?
其实顾名思义,Extra是补充说明的意思,也就是说,Extra中的值补充说明了MySQL的搜索引擎(默认为InnoDB)对当前的select语句的执行计划。因而并不是说Using index的效率就一定比Using where;Using index要好。
在分别介绍以上四个值之前,我们需要知道,MySQL的架构分成了server层和存储引擎层(storage engine),server层通过调用存储引擎层来返回数据。
其中Using index表示查询的列被索引覆盖,因而无需再回表(如果你不知道啥叫回表,请参见第3篇博客)查询,因而效率较高。例如:select id from test where id = 5;其中id为主键。
Using where;Using index表示查询的列被索引覆盖,且where筛选条件是索引列前导列的一个范围,或者是索引列的非前导列,例如:select id from test where id > 5;。很明显,效率也很高。
Using where表示查询的列未被索引覆盖,且where筛选条件是索引列前导列的一个范围,或者是索引列的非前导列,或者是非索引列,例如:select * from test where id > 30; 。因为未被索引覆盖,所以需要回表,因而性能比前两者差。
Extra为null表示查询的列未被索引覆盖,且where筛选条件是索引的前导列,这意味着用到了索引,但是部分字段未被索引覆盖,必须通过“回表”来实现,因而性能也比前两者差。
Using index condition是MySQL 5.6中引入的一种新特性,叫做Index Condition Pushdown(ICP),是一种在存储引擎层使用索引过滤数据的一种优化方式。这里的“下推” 是指将原来在server层进行的table filter中可以进行index filter的部分,在引擎层面使用index filter进行处理,不再需要回表进行table filter。使用ICP可以减少存储引擎层返回需要被index filter过滤掉的行记录,省去了存储引擎访问基表的次数以及MySQL服务器访问存储引擎的次数。Using index condition仅适用于二级索引,原因是ICP的目的是减少全行读取的次数,从而减少IO操作。而对于innodb聚集索引,完整的记录已被读入到innodb缓冲区,在这种情况下,ICP不会减少io,所以ICP只适用于二级索引,一般发生在查询字段无法被二级索引覆盖的场景,该场景下往往需要回表。通过ICP,可以减少存储引擎返回的行记录,从而减少了IO操作。
参考博客:
2. http://www.360doc.com/content/19/0220/21/2245786_816403574.shtml MySQL中Explain执行计划中额外信息字段Extra详解
3. https://blog.csdn.net/chy_0108/article/details/83615010 数据库回表
4. https://www.jianshu.com/p/c6483ded042d Mysql索引ICP
5. https://www.cnblogs.com/chenpingzhao/p/6720531.html 关于ICP、MRR、BKA等特性
6. https://www.cnblogs.com/wy123/p/7366486.html MySQL执行计划extra中的using index 和 using where using index 的区别
7. https://www.cnblogs.com/fswhq/p/icp.html Index Filter及ICP特性