【问题标题】:SQL Propper indexing, range + normal search at the same timeSQL Propper 索引,范围+普通搜索同时进行
【发布时间】:2011-11-29 19:05:51
【问题描述】:

假设我有这样的简单表格:

ID (PRIMARY)
time (INT)
stage (TINYINT)
other fields...

我必须按时进行范围搜索,同时正常选择阶段。以 SQL 查询为例:

SELECT * FROM table WHERE time>10000 AND (stage=1 OR stage=3 OR stage=4)

非常重要:很多行具有stage = 2,比如说99% 的表格。只有 5 个不同的阶段值。

该表的正确索引是什么?

【问题讨论】:

  • 如果它有所作为,则在此表中COUNT(DISTINCT stage) <= 5 成立。因此,理论上,五个独立的时间指标就足够了。
  • 我认为只有(stage, time)(time) 索引在这里有用。我怀疑(time, stage) 索引对此类查询是否有帮助。

标签: mysql sql database-design indexing


【解决方案1】:

这取决于不同列中值的分布。 如果可能的 stage 值很少,那么在 time 上单独索引和在 stage 上设置一个索引或使用组合索引 time, stage 时,您可能会获得最佳性能。

但是,如果您有很多不同的 stage 值,则以相反的方式对索引进行排序可能会更快:stage, time

但与AND 搜索相比,使用OR 会使stage 搜索更加分散。因此,我会尝试将time 放在索引的首位。

确定您的特定数据集的唯一方法是尝试和衡量,但上述三个候选者是我最适合索引的候选者。

编辑
如果您的大多数查询按时间范围搜索,您可能希望在time 上创建聚集索引,可能是time, stage。这样,一旦您在索引中找到正确的行,就可以最大限度地减少表中的查找。
请注意,如果在插入新记录时time 严格增加,这可能会创建碎片数据空间。

【讨论】:

  • 我更新了问题以使其更加清晰。答案有什么变化吗?
  • 我没有看到任何明显的变化。如果您没有大量数据,这应该非常快。我添加了关于聚集索引的注释。
【解决方案2】:

如果 stage-column 中的基数较低,则首先创建一个 time 和 stage 的索引。您还可以将阶段部分更改为AND stage IN (2, 10) 可能会提高性能和可读性。 :)

祝你好运!

【讨论】:

    猜你喜欢
    • 2012-03-04
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 2014-11-24
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多