如何将低/高基数列配对为复合索引?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将低/高基数列配对为复合索引?相关的知识,希望对你有一定的参考价值。
这个问题与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.
答案
一些事情,请记住这些是普遍性
- 通常,您只能使用索引的前导部分。所以看看你的例子 如果在(A,B,C)上有索引,并且在A和C上有谓词,则只能使用A上的索引。现在有些情况下可以使用索引的非前导部分;您将在执行计划中将此视为SKIP-SCAN操作,但它们通常是次优的。所以你可能想要(A,C)和(C,A)
- 如果您不预测索引中的列以外的列,则覆盖索引可能很有用。
- 通常,如果列具有低选择性,通常不需要或不需要索引。但是,您可能有两个单独具有低选择性的色谱柱,但在组合使用时具有高选择性。 (实际上,这是维度模型中位图索引/星形变换的前提)。
- 如果多列索引很有用,您可能希望首先选择具有最低选择性的列并启用索引压缩。索引压缩在某些情况下可以节省大量空间,并且CPU开销很小。
最后,SQL Monitor报告将帮助您在运行它时优化sql语句。
另一答案
最佳数量索引以最佳方式处理所有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
的最佳选择;后者不是。 (等)注:=
与某种“范围”测试有关。
在为表设计索引时,首先写出所有查询。
以上是关于如何将低/高基数列配对为复合索引?的主要内容,如果未能解决你的问题,请参考以下文章
Pandas把dataframe的索引复合索引变换为数据列:包含单索引到单列(重命名)复合索引到多数据列复合索引的其中一个水平变换为数据列
pandas把dataframe的数据列转化为索引列实战:单列转化为索引多列转化为复合索引