什么是涵盖指数?

时间:2008-09-15 10:45:58

标签: sql database indexing

我刚刚在一些数据库讨论中听到了覆盖索引这个术语 - 这是什么意思?

4 个答案:

答案 0 :(得分:53)

覆盖索引是一个索引,其中包含查询所需的所有列,甚至可能更多列。

例如,这个:

SELECT *
FROM tablename
WHERE criteria

通常会使用索引来加快使用条件检索哪些行的分辨率,但随后它将转到完整表以检索行。

但是,如果索引包含列 column1,column2 column3 ,那么这个sql:

SELECT column1, column2
FROM tablename
WHERE criteria

并且,如果可以使用特定索引来加快要检索的行的分辨率,则索引已经包含您感兴趣的列的值,因此它不必转到表中检索行,但可以直接从索引生成结果。

如果您看到典型的查询使用1-2列来解析哪些行,然后通常添加另外1-2列,也可以使用此选项,附加这些额外的列(如果它们是同样遍及索引,以便查询处理器可以从索引本身获取所有内容。

这是关于这个主题的article: Index Covering Boosts SQL Server Query Performance

答案 1 :(得分:13)

覆盖索引只是一个普通的索引。如果它能够满足查询而无需分析数据,那就称之为“覆盖”。

示例:

CREATE TABLE MyTable
(
  ID INT IDENTITY PRIMARY KEY, 
  Foo INT
) 

CREATE NONCLUSTERED INDEX index1 ON MyTable(ID, Foo)

SELECT ID, Foo FROM MyTable -- All requested data are covered by index

这是从SQL服务器检索数据的最快方法之一。

答案 2 :(得分:2)

覆盖索引是“覆盖”特定表所需的所有列的索引,无需为给定的查询/操作访问物理表。

由于索引包含所需的列(或它们的超集),因此可以使用索引查找或扫描替换表访问 - 这通常要快得多。

要涵盖的专栏:

  • 参数化或静态条件;受参数化或常数条件限制的列。
  • 加入专栏;动态用于加入的列
  • 选中的列;回答选定的数值。

虽然覆盖索引通常可以为检索提供良好的好处,但它们确实会增加插入/更新开销;由于需要在每次更新时写入额外或更大的索引行。

覆盖已加入查询的索引

覆盖索引作为连接查询的性能技术可能是最有价值的。这是因为联合查询的成本更高且更高。然后单表检索更有可能遭受高成本性能问题。

    在连接查询中
  • ,应该考虑每个表覆盖索引。
  • 每个“覆盖索引”从计划中删除物理表访问权限。将其替换为仅索引访问。
  • 调查计划成本&尝试用覆盖索引替换哪些表是最值得的。
  • 通过这种方式,可以显着降低大型连接计划的乘法成本。

例如:

select oi.title, c.name, c.address
from porderitem poi
join porder po on po.id = poi.fk_order
join customer c on c.id = po.fk_customer
where po.orderdate > ? and po.status = 'SHIPPING';

create index porder_custitem on porder (orderdate, id, status, fk_customer);

请参阅:

答案 3 :(得分:2)

假设您有一个包含以下列的简单表,您只在此处编入了索引:

Id (Int), Telephone_Number (Int), Name (VARCHAR), Address (VARCHAR)

想象一下,您必须运行以下查询并检查其是否使用索引,以及是否在没有I / O调用的情况下高效执行。请记住,您只在Id上创建了一个索引。

SELECT Id FROM mytable WHERE Telephone_Number = '55442233';

当您检查此查询的性能时,您将失望,因为Telephone_Number未编入索引,因此需要使用I / O调用从表中获取行。因此,这不是索引覆盖,因为查询中有一些列未编入索引,这会导致频繁的I / O调用。

要使其成为覆盖索引,您需要在(Id, Telephone_Number)上创建复合索引。

有关详细信息,请参阅此博客: https://www.percona.com/blog/2006/11/23/covering-index-and-prefix-indexes/