按值分类的索引中的多个列的顺序

时间:2013-08-16 17:35:36

标签: database-design indexing

示例:

表A的字段为Person和DateTime。我想在日期之后查询一个人的数据。有1000万行,有1000个不同的人,日期时间在一年内平均分配。

问题:

在与示例相似的情况下播放时,我在采取措施并观察sybase sql数据库上的执行计划之后得出了以下结论。我无法在互联网上找到很好的信息。你会考虑将陈述作为一般的真实规则,还是依赖于......,以及什么?

当存在具有或多或少不同值的不同列时,我们使用在索引中使用所有列(带有sense)的语句读取数据,那么它是最佳的读取性能:

  • 如果索引有一个字段,则选择具有最多样化值的列。
  • 如果索引包含多个字段,请选择从最不多样化到最多样化的顺序列。

当我想象一个索引在树中组织指针时,每个节点有两个后代,那么上面的语句对我来说似乎合乎逻辑,不是吗?我会对关于如何构建,使用索引结构或者关于什么引擎使用哪种类型的知识的链接感兴趣,因为我觉得它对上面的语句有影响......或者不是?谢谢

1 个答案:

答案 0 :(得分:0)

(虽然我不熟悉Sybase,但我认为我几乎没有关于索引的一般性陈述......)

  

表A的字段为Person和DateTime。我想在日期之后查询一个人的数据。有1000万行,有1000个不同的人,日期时间在一年内平均分配。

看起来你只需要一个日期/时间位于其前沿的索引。

  

如果索引有一个字段,则选择具有最多样化值的列。

如果您可以选择,那么您不必只选择一列 - 选择多列如果合适。例如,复合索引可以满足AND条件,但OR需要单独的索引。

  

如果索引有多个字段,请按顺序选择从最不多样化到最多样化的列。

复合索引中字段的顺序应主要受索引应该提供的查询类型的影响。例如,如果需要提供这两个查询:

SELECT * FROM T WHERE C1 = 'foo' AND C2 = 'bar'
SELECT * FROM T WHERE C1 = 'foo'

...那么在{C1,C2}上创建一个索引比在{C2,C1}和{C1}上创建两个索引要好得多,即使C2具有更好的选择性 1

传统观点认为,具有更好选择性的色谱柱应首先出现在复合指数中,但不应盲目遵循此规则。例如,Oracle可以压缩索引前沿,在这种情况下,具有较小选择性的列实际上应该首先出现。即使没有索引压缩,如果更符合您的查询模式,您可能希望cluster选择性较低的列上的数据。

索引是一项复杂的平衡行为,我热烈建议您阅读Use The Index, Luke!以更全面地处理该主题......


1 索引中不同键值的数量与索引行数之间的比率。我想这就是“多样性”的意思。