MySQL 覆盖索引

在 MySQL 中,当查询语句只需要从索引中获取所需的数据,而无需回到数据表中再次查找,这种索引就被称为覆盖索引(Covering Index)。

假设有一个表 t1,包含字段 id、name 和 age,现在需要查询 name 字段等于 “Alice” 的记录,可以使用如下 SQL 语句:

SELECT id, name FROM t1 WHERE name = 'Alice';

如果 t1 表中的 name 字段上建有索引,MySQL 可以直接从索引中获取 name 字段等于 “Alice” 的记录的 id 和 name 值,而不需要再去数据表中查询,这样的查询就是覆盖索引查询。

覆盖索引的好处是可以避免回表操作,减少查询所需的 I/O 操作和 CPU 资源消耗,提高查询效率。但是需要注意的是,覆盖索引只适用于某些查询,例如只需要查询索引列或查询列包含在索引中的查询,如果需要查询的列不在索引中,仍然需要回到数据表中查询,这时覆盖索引就无效了。

覆盖索引的一个典型例子是在 SELECT 语句中只查询了索引列或查询列包含在索引中的情况,比如:

SELECT id, name FROM t1 WHERE name = 'Alice';
SELECT name, COUNT(*) FROM t1 GROUP BY name;

在这些情况下,如果 t1 表中的 name 字段上建有索引,就可以使用覆盖索引,从而避免回表操作,提高查询效率。