SQL Propper索引,范围+正常搜索同时进行

时间:2011-11-29 19:05:51

标签: mysql sql database-design indexing

假设我有这样的简单表:

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个不同的阶段值。

这张表的支持者索引是什么?

2 个答案:

答案 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),从而提高性能和可读性。 :)

祝你好运!