0

这个例子:

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

问题:

在与示例类似的情况下玩了一下,我在采取措施并观察了sybase sql数据库上的执行计划后得出了以下结论。我真的找不到关于在互联网上的好信息。您是否会将以下陈述视为普遍的真实规则,还是取决于...,以及取决于什么?

当有不同的列具有或多或少不同的值,并且我们使用使用索引中所有列(有意义)的语句读取数据时,那么它是读取性能最好的:

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

当我想象一个索引组织一棵树中的指针时,每个节点都有两个后代,那么上面的陈述对我来说似乎是合乎逻辑的,不是吗?我也会对有关如何构建、使用索引结构或了解哪些引擎使用哪些类型的链接感兴趣,因为我觉得这对上面的陈述有影响......或没有?谢谢

4

1 回答 1

0

(虽然我不熟悉 Sybase,但我想我可以贡献一些关于索引的一般性陈述......)

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

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

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

如果您可以选择,那么您不必只选择一列 -如果合适,选择多列。例如,复合索引可以满足 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 可以压缩索引前沿,在这种情况下,选择性较小的列实际上应该排在最前面。即使没有索引压缩,如果更符合您的查询模式,您可能希望将数据聚集在选择性较低的列上。

索引是一个复杂的平衡行为,我强烈推荐阅读使用索引,卢克!为了更彻底地处理这个话题......


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

于 2013-08-16T18:34:13.700 回答