覆盖指数是具体指数吗?
是的,它是一个专门为满足特定查询而设计的索引。
对于这个查询
select id, name, age from table where id = 1
覆盖索引是(id, name, age)
由创建的多列索引
create index idx_name_age on table(id, name, age)
怎么会这样?
id
是索引中的第一列,因为它用于WHERE id = 1
. 首先是因为 MySQL 索引通常是 BTREE,按索引顺序随机访问。因此WHERE id = 1
可以在索引中跳转以查找这些id
值。
name
并且age
也出现在索引中,因为它们出现在SELECT
子句中。因为它们在索引中,所以查询可以完全从索引中得到满足。这很好,因为它减少了从磁盘或 ssd 的读取:MySQL 在满足查询之前不必使用索引来查找主表中的行。
仅(id, name)
上的索引不是上述查询的覆盖索引;该age
列丢失。
这个查询
select id, name from table where id = 1
也可以通过 (id, name, age)
覆盖索引来满足。它也可以通过(id, name)
:上的索引来满足,这是第二个查询(但不是第一个查询)的覆盖索引。
您的示例说明了词汇表的定义。索引通过使用额外的磁盘/ssd 空间来存储数据来提高查询性能。
Microsoft SQL Server 用户可以像这样声明索引:
create index idx_name_age on table (id) include (name, age)
在此索引中, 的值name
和 与索引中的age
一起使用id
,但索引未按包含的列排序。因此,更新索引需要更少的时间。
如果id
是表的主键,则在 MySQL 的 InnoDB 或 SQL Server 中都不适用。表本身是一个索引id
;它有时被称为聚集索引。但现在我们进入了太多细节。
如果使用得当,覆盖索引可以显着提高查询性能。阅读https://use-the-index-luke.com/ 要获得帮助的索引,您必须设计它们以匹配您的查询。这是数据库优化艺术的很大一部分。