覆盖索引

在聚集索引和非聚集索引之间的折中被称为覆盖索引,其在索引内存储表的一部分列。这允许通过单独使用索引来查询一些列。(这种情况索引覆盖了查询)

为了讲解,先创建一张表,如下:

  1. CREATE TABLE person_info(
  2. id INT NOT NULL auto_increment,
  3. name VARCHAR(100) NOT NULL,
  4. birthday DATE NOT NULL,
  5. phone_number CHAR(11) NOT NULL,
  6. country varchar(100) NOT NULL,
  7. PRIMARY KEY (id),
  8. KEY idx_name_birthday_phone_number (name, birthday, phone_number)
  9. );

建立表的时候为 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 的信息,所以不用回表操作。
排序操作也可以利用覆盖索引这个特性。