高级8、数据库索引之覆盖索引coveringindex
2018-05-18 本文已影响3人
阿休
简介
覆盖索引是InnoDB中索引的特例,索引中包含查询的所有必填字段;换句话说,索引本身包含执行查询所需的数据,而不必执行额外的读取。
请注意,在InnoDB中,数据是使用主键索引存储的。换句话说,数据通过主键索引物理地存储为B +树。因此,主键被包括在所有二级索引的叶节点中以便建立从二级索引到实际数据行的引用。
因此,任何涉及二级索引的查找都必须从根节点通过分支节点导航到正确的叶节点以获取主键值,然后对主键索引执行随机IO读取(再次从根节点通过分支节点到正确的叶节点)来获取数据行。
使用覆盖索引,我们避免了在主键索引(一个B +树较少遍历,避免昂贵的IO操作)上的这种额外的随机IO读取以获取数据行,因为查询所需的所有字段都包括在覆盖索引中。
什么时候使用覆盖索引
避免大表额外的IO读取。有时甚至可以避免额外的物理随机IO读取(最昂贵的IO操作)。
我们可以使用这个特定的索引进行查询,需要:
过滤符合一定条件的行(WHERE子句)
分组数据(GROUP BY子句)
按覆盖索引(ORDER BY子句)的顺序排序数据
投影数据(SELECT子句)
实例测试
创建测试表
CREATE TABLE big_table(
id int primary key auto_increment,
field01 int,
field02 int,
field03 varchar(50)
) engine=innodb;
文章来源:https://m.aliyun.com/yunqi/articles/412937