覆盖索引
Btree除了可以帮助加快过滤数据和找到数据内容之外,还可以排序、分组,其实还可以通过Btree直接获取数据。Btree索引和hash索引不同,在Btree索引的叶子节点存储了索引的关键字的值,所以如果我们可以通过关键字直接获取索引查询中需要的数据,那么也就没必要读取数据行的信息了。这种包含需要查询的所有字段值的索引指的是覆盖索引。
这里所说的全不值,不仅仅说where子句里出现的值,还包括出现在select和order by 、group by中的值。
好处:
1:可以优化缓存,减少磁盘IO操作。
一般索引的数量远远小于表的字段数,如果我们只需要读取索引就可以完成查询,那么Mysql可以减少访问量,因为索引比较小,那么mysql可以减少与磁盘的IO。
2:可以减少随机IO,变随机IO为顺序IO操作。
3:可以避免Innodb主键索引的二次查询。
innodb二级索引在叶子节点保存的是行的主键值,通常利用二级索引查询数据的时候,那么在查找到相应的键值后,通过主键进行二次查询才能获得行数据;而覆盖索引二级索引的键值就可以获取要查询的所有数据,这样避免了二次查询,减少IO操作。
4:可以避免myisam表进行系统调用。
对于myisam而言,mysql会缓存索引的信息,数据依赖操作系统缓存,假如需要访问数据,需要系统调用,系统调用性能差,会产生性能问题,如果通过索引获取全部数据,避免系统调用产生。
无法使用覆盖索引的情况有哪些?
1:存储引擎有的不支持,比如memory
2:查询中使用了太多的列。比如索引本来很大,就没必要使用覆盖索引了,比如select *。
3:使用了双%的like查询。