使用SQL Server,我得到了一个项目,其中一个表具有一个非聚集索引,其中包含两个键CompanyID
和EmployeeID
。我总是觉得我必须做一个查询,其中包含两个键以快速查找。
例如:
select * from tblTable where CompanyID = 100 and EmployeeID = 1234
但如果我只搜索一列,那么它不会正确使用这个索引吗?
select * from tblTable where CompanyID = 100
这是对的吗?我总是在印象中,我必须为我想要快速搜索的每一列创建一个单独的索引,并且多键索引是我需要对两个键进行独特组合。
答案 0 :(得分:2)
不一定 - 它取决于索引中键的顺序。
在您的情况下,如果索引在(CompanyID, EmployeeID)
上,那么该索引可能会用于包含这两列的查询,但也可能仅对包含这些列的查询有用CompanyID
条款WHERE
。
但是,永远不会能够用于仅在EmployeeID
子句中使用WHERE
列的查询。如果您对EmployeeID
有很多疑问,则可以调查是否可以在EmployeeID
上为这些查询添加单独的附加索引。
通常,多列索引可能对使用n个最左列有用,例如只有CompanyID
(最左边一列)或CompanyID
和EmployeeID
(最左边两列)。
答案 1 :(得分:0)
SQL服务器将评估是否可以根据成本使用索引,并根据您的值的选择性估算成本。如果您筛选的列不是索引的第一列,则可以获取索引扫描,但不能获取索引搜索。但是当您使用SELECT *时,您可能最终会进行聚簇索引扫描。
CREATE TABLE dbo.x
(
a int,
b int,
c int,
d int
)
CREATE CLUSTERED INDEX ix1 ON dbo.X (a);
CREATE NONCLUSTERED INDEX ix2 ON dbo.X (b,c);
INSERT INTO dbo.X (a,b,c) VALUES(1,1,1);
SELECT * FROM dbo.X WHERE b=1 --will probably use a clustered index scan
SELECT a FROM dbo.X WHERE b=1 --can use a non-clustered index seek (a is in the index as it's part of the clustered index key
SELECT a FROM dbo.X WHERE c=1 --will probably use a nonclustered index scan as c is not the first column
SELECT a,d FROM dbo.X WHERE b=1 --will probably use a clustered index scan as d is not part of the index