我有一个包含列 A、B、C、D、E、...、N
的表格。使用 PK(A)
。我还为 D
、C
、B
、A
列定义了一个复合的、唯一的、非聚集索引, 按此顺序。
如果我使用如下查询:
where D = 'a' and C = 'b' and B = 'c'
如果没有 A 的子句,我还能享受索引的好处吗?
最佳答案
是的,对于这些查询,SQL 服务器可以对索引 (D, C, B, A)
执行查找操作:
WHERE D = 'd'
WHERE D = 'd' AND C = 'c'
WHERE D = 'd' AND C = 'c' AND B = 'b'
WHERE D = 'd' AND C = 'c' AND B = 'b' AND A = 'a'
它可以对这些索引执行扫描操作:
WHERE C = 'c' AND B = 'b'
WHERE A = 'a'
-- etc
但是还有一件事需要考虑:索引中列的顺序很重要。两个索引 (D, C, B, A)
和 (B, C, D, A)
的表现可能不同。考虑以下示例:
WHERE Active = 1 AND Type = 2 AND Date = '2019-09-10'
假设数据包含两个不同的 Active 值,10 个 Type 和 1000 个 Date,(Date, Type, Active, Other)
的索引将比 (事件、类型、日期、其他)
。
您还可以考虑为不同的查询创建上述索引的不同变体。
PS:如果列 A
没有在 WHERE 子句中使用,那么你可以简单地 INCLUDE
关于sql - 4 列复合索引是否有益于 3 列查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52262208/