mysql覆盖索引

2025-04-2003:55:06常识分享0

什么是覆盖索引?

定义一:当select的数据列仅通过索引就能获取,无需从数据表中读取,即查询列被所使用的索引完全覆盖,这就是覆盖索引。

解释二:覆盖索引是高效找到数据行的一种方法。如果通过检索索引可以直接读取所需数据,那么就不必再到数据表中读取行。当索引包含了(或覆盖了)满足查询语句中字段与条件的数据时,我们称之为覆盖索引。

解释三:覆盖索引是非组合索引的一种形式。它确保索引中包含了在查询的Select、Join和Where子句中用到的所有列。换句话说,索引中存储了查询正在查找的所有数据。

并不是所有类型的索引都能成为覆盖索引。覆盖索引要求必须存储索引的列。像哈希索引、空间索引和全文索引等并不存储索引列的值,所以MySQL主要使用B-Tree索引来做覆盖索引。当发起一个被索引覆盖的查询(也称为索引覆盖查询)时,在EXPLAIN的Extra列可以看到“Using index”的信息。

关于数据库中的几种重要索引:

MySQL的索引

一个表中只能有一个索引,且其顺序与数据的真实物理存储顺序相一致。索引的叶子节点上包含了该行的所有数据,因此查询速度非常快。索引的顺序与数据的逻辑存储顺序一致,有利于范围查询的快速执行。需注意,主键并不等同于索引。

辅助索引(非索引)

一个表中可以存在多个辅助索引。这些索引的叶子节点并不存放整行数据,而是存放键值,同时包含一个指向聚簇索引的“书签”。通过这个书签,我们可以找到聚簇索引树中的整行数据。

联合索引

联合索引是由多列组成的索引,它遵循最左前缀规则。联合索引对where、order by和group by子句都有效,能提高多条件查询的效率。

覆盖索引的特点及应用场景:

覆盖索引指的是从辅助索引中就能获取到所需的记录,无需再查找聚簇索引中的记录。这减少了IO操作,因为辅助索引通常比聚簇索引数据量少。利用覆盖索引可以加快数据处理速度,特别是在需要大量读取操作的数据场景中。

索引与辅助索引的区别:

主要的区别在于叶子节点是否存放了一整行数据。索引的叶子节点包含整行数据,而辅助索引的叶子节点只包含键值和指向聚簇索引的“书签”。

最左前缀规则的解释:

在最左前缀规则中,假设联合索引由列(a,b,c)组成,那么遵循该规则的顺序如a、ab、abc。Select、Where、Order by、Group by子句都可以匹配最左前缀。如果不遵循该规则,则可能无法有效利用联合索引。