加速从大型整数表中选择SQL查询

时间:2018-04-30 10:13:27

标签: mysql sql

我有一张表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。

那么,如果可能的话,如何更快地进行此查询呢?

3 个答案:

答案 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必须小于你想要的数字,你可以从任何考虑中消除所有那些更高的值。它强制列表到最低限定符。