假设我有这样的简单表:
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个不同的阶段值。
这张表的支持者索引是什么?
答案 0 :(得分:1)
它取决于不同列中值的分布。
如果您的stage
值很少,则time
上的单独索引和stage
上的索引或合并索引time, stage
可能会获得最佳效果。< / p>
但是如果您有很多不同的stage
值,那么以相反的方式订购索引可能会更快:stage, time
。
但与OR
搜索相比,使用stage
会使AND
搜索更加分散。因此,我会尝试在索引中首先time
。
确定您的特定数据集的唯一方法是尝试和衡量,但上面提到的三个候选人是我的最佳候选人。
修改强>
如果大多数查询按时间范围搜索,您可能希望在time
上创建聚簇索引,可能是time, stage
。这样,一旦在索引中找到了正确的行,就可以最小化表中的查找
请注意,如果在插入新记录时time
严格增加,则可以创建碎片数据空间。
答案 1 :(得分:1)
如果stage-column中的基数较低,则创建一个时间优先的索引和第二阶段的索引。您还可以将舞台部分更改为AND stage IN (2, 10)
,从而提高性能和可读性。 :)