SQL Server两列索引,但仅在一列上查询

6

在旧版代码中,我发现了以下索引:

CREATE CLUSTERED INDEX ix_MyTable_foo ON MyTable
(
    id ASC,
    name ASC
)

如果我理解正确,该索引对于只查询id列或同时查询idname列是有用的。我理解正确吗?

因此,通过执行以下操作可能会改善记录的检索:

select someColumn from MyTable where id = 4

但对于这个查询它不会有任何作用:

select someColumn from MyTable where name = 'test'

5
是的,你的理解完全正确——任何多列索引仅在查询左侧(n)个列时才有用。在你的情况下,要么只查询id列,要么同时查询idname列——但不能只查询name列。 - marc_s
如果我的查询像这样: select someColumn from MyTable where id=id and name ='test' 聚集索引会有什么好处吗? - Nik Dell
1个回答

3

是的,你说得对。但是如果你有许多列的表:

A
B
C
D
..
F

在你的主键索引为(A)的情况下,如果你有第二个索引例如(B,C),当你使用这样的查询时,引擎可能会决定使用它。
CREATE TABLE dbo.StackOverflow
(
    A INT
   ,B INT 
   ,C INT 
   ,D INT 
   ,E INT
   ,PRIMARY KEY (A)
   ,CONSTRAINT IX UNIQUE(B,C)
)

SELECT A     
      ,C 
FROM dbo.StackOverflow
WHERE C = 0;

输入图像描述

因此,如果一个索引可以被用作“覆盖”,即使您不关心一些列,引擎也可能使用它,因为它会决定执行的工作量更少(读取量更小)。

在您的情况下,似乎使用id列上的主键与第二个索引上的name列组合是更好的选择。


如果我的where子句同时提到这两列,但是where子句的顺序与索引中的顺序不同,索引仍然会被应用,对吗?例如:select 1 from MyTable where name='test' and id=4 - Developer Webs
是的,索引将被使用。在这个语句中,子句的顺序并不重要。 - gotqn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接