在MsSql(和大多数其他关系数据库)中,“复合索引”是一个具有多个键的索引。假设我们有一个经常运行的查询,我们想为这个查询创建一个覆盖索引,以加快查询速度;
SELECT a, b FROM MyTable WHERE c = @val1 AND d = @val2
这些都是可能覆盖此查询的复合索引;
CREATE INDEX ix1 ON MyTable (c, d, a, b) CREATE INDEX ix2 ON MyTable (c, d) INCLUDE (a, b) CREATE INDEX ix3 ON MyTable (d) INCLUDE (a, b, c) CREATE INDEX ix4 ON MyTable (c) INCLUDE (a, b, d)
但看起来,他们的表现并不相同。根据Erlan Sommarkog(微软MVP)的说法,前两名比第三名和第四名更快,第四名比第3名更快。
他接着解释;
ix2是“最佳”索引,因为a和b不会占用索引树较高级别的空间。此外,如果更新了a或b,在ix2中不会出现页面拆分或类似情况,因为索引树不受影响。
然而,我很难理解到底发生了什么。我确实对b树索引及其工作原理有一般的了解,但我不理解复合键背后的逻辑。例如
CREATE INDEX ix1 ON MyTable (c, d, a, b)
这里的列顺序重要吗?如果是,为什么?而且
CREATE INDEX ix2 ON MyTable (c, d) INCLUDE (a, b)
这个复合键和上面的键有什么区别?我不明白“INCLUDE”有什么不同。