为了尝试为我的数据库做出最佳索引选择,我注意到了一些我想解决的特定行为。
观察下表和相应的索引(SQL Server 2005):
CREATE TABLE demo
(
id INT PRIMARY KEY IDENTITY,
name NVARCHAR(50) NOT NULL,
password BINARY(20) NOT NULL
);
CREATE NONCLUSTERED INDEX idx_demo_foo ON demo ( name, password );
在这种情况下,如果我执行以下查询...
SELECT id FROM demo
WHERE name = @0
AND password = @1;
...仅发生非聚集索引搜索。这让我很奇怪,因为我没有明确地将id添加到非聚集索引。
答案 0 :(得分:6)
聚簇索引键始终包含在非聚簇索引中。聚簇索引键是表的行定位符,每个索引必须包含行定位符,以便将索引行与表行匹配。
答案 1 :(得分:0)
NCIX必须包含Clustered Index键,以便系统知道如何到达表本身的底层行。因此,如果您的主键背后有一个聚集索引(默认情况下会这样),那么您很幸运。
当然,如果您更改聚簇索引,或者将表放入堆中,那么您将需要查找才能访问主键。
编辑:我建议从索引键中取出密码字段,并将其作为包含列。当然,您只需按用户名查找条目,然后检查密码是否匹配,而不是为每个用户名设置多个密码。
create index ixBlah on demo (name) include (password);
罗布
答案 2 :(得分:-1)
索引查找。这与主键无关。