这个问题与Oracle DB有关,所以如果有一般答案我想知道。因为我正在丢弃有关此主题的Derby / MySQL和其他DB的信息。
假设我在其WHERE
子句中使用以下列有几个查询:
Column | Cardinality | Selectivity
_______|__________________________
A | low | low
B | high | low
C | low | low
D | high | high
E | low | low
F | low | low
-- Queries
SELECT * FROM T WHERE A:=? AND B:=?
SELECT * FROM T WHERE A:=? AND B:=? AND C:=?
SELECT * FROM T WHERE A:=? AND C:=?
SELECT * FROM T WHERE A:=? AND C:=? AND D:=?
SELECT * FROM T WHERE A:=? AND E:=? AND F:=?
将这些列(考虑基数混合)配对作为复合索引有什么好处?如果是这样,那么遵循什么逻辑呢? 我理解this explanation但它适用于SQL Server,它可能表现不同。
是否值得覆盖索引而不是单个小型复合索引?
复合索引的列顺序是否重要?即:
-- Regardless the column order on the table creation.
CREATE INDEX NDX_1 ON T (A, C);
-- Versus:
CREATE INDEX NDX_1 ON T (C, A);
CREATE INDEX NDX_2 ON T(E, F); -- (low + low) Ignoring 'A' column.
答案 0 :(得分:2)
有些事情并牢记这些是一般性
通常,您只能使用索引的前导部分。所以看 在你的例子
如果你有一个索引(A,B,C),你有一个关于A和的谓词 C,那么只能使用A上的索引。现在有一些情况 可以使用索引的非前导部分;你会看见 这在执行计划中作为SKIP-SCAN操作,但它们是 通常是次优的。所以可能希望拥有(A,C)和(C,A)
如果您不投影索引以外的列,则覆盖索引可能很有用。
通常,如果列的选择性较低,通常不需要或不需要索引。但是,您可能有两个单独具有低选择性的色谱柱,但在组合使用时具有高选择性。 (实际上,这是维度模型中位图索引/星形变换的前提)。
如果多列索引很有用,您可能希望首先选择具有最低选择性的列并启用索引压缩。索引压缩在某些情况下可以节省大量空间,并且CPU开销很小。
最后,SQL Monitor报告将帮助您在运行时优化sql语句。
答案 1 :(得分:1)
最佳数量索引以最佳方式处理所有5种情况:
(A, B, C) -- in exactly this order
(A, C, D) -- in exactly this order
(A, E, F) -- in any order
如果您添加其他SELECT
,则所有投注均已关闭。
何时拥有(A, C)
和 (C, A)
?...
WHERE A=1 AND C>5
;后者不是。 (等)注:=
与某种"范围"测试事宜。在为表设计索引时,首先写出所有查询。