SELECT x FROM t WHERE y = 5; ⇒ INDEX(y,x) -- The algorithm said just INDEX(y)
SELECT x,z FROM t WHERE y = 5 AND q = 7; ⇒ INDEX(y,q,x,z) -- y and q in either order (Algorithm), then x and z in either order (covering).
SELECT x FROM t WHERE y > 5 AND q > 7; ⇒ INDEX(y,q,x) -- y or q first (that's as far as the Algorithm goes), then the other two fields afterwards.
查看 MySQL 文档,词汇表指出了有关Covering Indexes的内容:
这里的含义是在 MySQL 中没有直接等效的
INCLUDE
语句,但是如果索引提供了索引中涉及的列的覆盖,那么很明显,它仍然可以被认为是覆盖的,就像包含列的索引一样在 SQL Server 中会。MariaDB 在其文档中包含以下用于覆盖索引的内容:
MySQL 不支持包含的列。
但是,如果您使用 InnoDB 存储引擎(这是默认的),所有列都物理地包含在主键中。换句话说,主键是表。如果将主键定义为
PRIMARY KEY (id)
行将按物理排序id
;但是对于所有使用主键的查询,主键将是一个覆盖索引。以下查询使用主键作为覆盖索引:
正如 Akina 在评论中指出的那样,InnoDB 二级索引包括对主键的引用。因此,如果您对电子邮件字段进行索引,则在索引中您将按顺序排列所有电子邮件,并且每个电子邮件都有相应的 ID。因此,对于每个二级索引,主键列都包含在列中。
以下查询使用二级索引作为覆盖索引:
出于好奇,我还可以告诉您,TokuDB 存储引擎支持集群索引,这只是包含列的另一个名称。不幸的是,TokuDB 不再由其供应商 Percona 维护。