什么是涵盖指数?

Mar*_*nnw 65 sql database indexing

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

ang*_*son 55

一个覆盖索引是一个包含所有的,甚至更多的指标,您需要为您查询列.

例如,这个:

SELECT *
FROM tablename
WHERE criteria
Run Code Online (Sandbox Code Playgroud)

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

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

SELECT column1, column2
FROM tablename
WHERE criteria
Run Code Online (Sandbox Code Playgroud)

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

如果您看到典型的查询使用1-2列来解析哪些行,然后通常添加另外1-2列,那么也可以使用它,附加那些额外的列可能是有益的(如果它们全部相同)到索引,以便查询处理器可以从索引本身获取所有内容.

这是一篇文章:索引覆盖提升了关于这个主题的SQL Server查询性能.

  • 因此,如果我为 col1、col2 和 col3 创建覆盖索引作为一个索引,那么我知道使用 col1、2 和 3 的查询会很快,但是如果我还有一个仅使用 col2 和 col3 的查询怎么办?它会使用覆盖索引还是会进行全表扫描?我应该为 col2 和 col3 的组合创建一个单独的覆盖索引吗? (2认同)

aku*_*aku 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
Run Code Online (Sandbox Code Playgroud)

这是从SQL Server检索数据的最快方法之一.

  • 虽然您的表定义包含主键,该主键在该列(ID)上创建聚簇索引,但将ID列添加到非聚集索引是多余的.群集密钥会自动添加到任何非群集索引. (2认同)
  • @edosoft - 您的评论可能是特定于数据库的.我的理解是,大多数数据库都会添加一个_row location_来寻址存储页面上的行.主键是逻辑标识符,而不是块级存储地址.如果您的命题属实,则不需要主键索引 - 实际上通常需要这些索引. (2认同)