InnoDB存储引擎支持覆盖索引
1)什么是覆盖索引?
覆盖索引实际上就是辅助索引,当从辅助索引中就可以查到查询需要的数据而不用去查询聚集索引时,这时辅助索引也可被称为覆盖索引。
下面回顾下辅助索引结构:
辅助索引的叶子节点仅存放索引键值以及该索引键值指向的主键。
2)使用覆盖索引的好处(提高查询速度)
使用覆盖索引的好处就是辅助索引不包含整行记录的所有信息,所以查询起来相比于聚集索引会快很多。(在辅助索引层就返回结果!!)
3)使用场景
对于InnoDB存储引擎的辅助索引而言,由于其中包含了主键信息,因此其叶子节点存放的数据为(primary key1 , primary key2,…,key1,key2,…)
则下面的语句仅可以使用一次辅助联合索引就可以完成查询:
SELECT key2 FROM table WHERE key1=xxx;
SELECT primary key2,key2 FROM table WHERE key1=xxx;
SELECT primary key1,primary key2,key2 FROM table WHERE key1=xxx;
综上而言:覆盖索引的好处对于某些统计问题和部分索引列单值查询可以减少IO操作。
如何辨别优化器选择了覆盖索引?
当这里的Extra列为Using index时且possssible_keys为NULL时,表示优化器选择了覆盖索引!!否则使用的是聚集索引。
4)何种情况下优化器不会选择索引?
一句话:当索引不能满足查询时,优化器会直接进行全表扫描。这种情况多发生于范围查找,JOIN操作等。
例如:
SELECT * FROM orderdetails where orderid>1000 and orderid<12000;