如何将低/高基数列配对为复合索引?

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:=?
  1. 将这些列(考虑基数混合)配对作为复合索引有什么好处吗?如果是这样,那么遵循什么逻辑呢?我已经理解了this explanation,但它适用于SQL Server,它可能表现不同。
  2. 是否值得覆盖索引而不是单个小型复合索引?
  3. 复合索引的列顺序是否重要?即:
-- 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);
  1. 这个指数会有用吗?
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的最佳选择;后者不是。 (等)注:=与某种“范围”测试有关。

在为表设计索引时,首先写出所有查询。

以上是关于如何将低/高基数列配对为复合索引?的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB向复合索引添加低基数字段?

Pandas把dataframe的索引复合索引变换为数据列:包含单索引到单列(重命名)复合索引到多数据列复合索引的其中一个水平变换为数据列

pandas把dataframe的数据列转化为索引列实战:单列转化为索引多列转化为复合索引

如何在 RDB 中实现常规索引和复合索引?

如何使用复合文字来“fprintf()”具有任意基数的多个格式化数字?

怎样在一个表中,为重复率不同的两列建立一个复合唯一聚集索引,使性能最佳?