我有一张表numbers
看起来像这样
id (int) | start (int u) | end (int u)
1 50 100
2 250 396
3 900 1000
它有大约400k行,其中的数据永远不会改变。 范围不重叠。
我正在运行这样的查询:
SELECT id FROM numbers WHERE *somenumber* BETWEEN start AND end LIMIT 1
查询需要大约.3秒来完成,这是永恒的,所以我试图想出一些解决方案来加快速度。 我想出的唯一一件事是在开始和结束列上打了一些索引,但这样做实际上使它变为SLOWER,同样的查询现在惊人地需要.9s来完成两列上的INDEXES。
那么,如果可能的话,如何更快地进行此查询呢?
答案 0 :(得分:0)
首先尝试numbers(start)
上的索引。
如果这没有帮助(并且between
可以阻止事情),那么让我假设范围不重叠。如果没有,那么试试这个:
SELECT id
FROM numbers
WHERE *somenumber* >= start
ORDER BY start DESC
LIMIT 1;
如果范围 重叠,那么您有一个更大的问题。我建议创建一个具有非重叠范围的新表。
答案 1 :(得分:0)
在列start
和列end
上创建多索引将加快您的用例流程。
答案 2 :(得分:0)
... REVISED
在重新思考之后,它甚至可以进一步简化为
即使在Id编号不是完全按顺序排列的情况下,也可以对样本数据进行推断
id (int) | start (int u) | end (int u)
1 50 100
2 250 396
3 900 1000
4 101 175
5 418 724
6 397 417
7 176 249
假设您正在寻找编号723(现在编号为#5)。
SELECT N.*
FROM numbers N
WHERE N.start <= 723
AND N.End >= 723
AND N.start < 723
between与显式&gt; =和&lt; =相同,但是通过添加start必须小于你想要的数字,你可以从任何考虑中消除所有那些更高的值。它强制列表到最低限定符。