覆盖索引
在聚集索引和非聚集索引之间的折中被称为覆盖索引,其在索引内存储表的一部分列。这允许通过单独使用索引来查询一些列。(这种情况索引覆盖了查询)
为了讲解,先创建一张表,如下:
CREATE TABLE person_info(id INT NOT NULL auto_increment,name VARCHAR(100) NOT NULL,birthday DATE NOT NULL,phone_number CHAR(11) NOT NULL,country varchar(100) NOT NULL,PRIMARY KEY (id),KEY idx_name_birthday_phone_number (name, birthday, phone_number));
建立表的时候为 name, birthday, phone_number 创建了一个联合索引,名称为 idx_name_birthday_phone_number。
覆盖索引(covering index)指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取。也可以称之为实现了索引覆盖。
二级索引中只有当前索引列和主键的信息,使用二级索引查找所有列的数据必然发生回表操作。
回表:通过二级索引上的主键信息找到聚簇索引。二级索引是顺序 I/O,而通过二级索引找到聚簇索引是随机 I/O。
为了彻底告别回表操作带来的损耗,建议查询列表限于索引列,如下所示:
SELECT name, birthday, phone_number FROM person_info WHERE name > 'Asa' AND name < 'Barlow'
二级索引这棵树中包含了 name, birthday, phone_number 的信息,所以不用回表操作。
排序操作也可以利用覆盖索引这个特性。
