Dan*_* T. 3 mysql sql optimization
我有一个看起来像这样的表:
ID StartRange EndRange
----------------------------
1 1 3
2 4 8
3 9 12
Run Code Online (Sandbox Code Playgroud)
依此类推,因此有超过500万条记录。最后一条记录如下所示:
ID StartRange EndRange
---------------------------------
5235976 9894727374 9894727378
Run Code Online (Sandbox Code Playgroud)
换句话说,StartRange和EndRange永远不会为每个记录重叠。
我需要进行查询,以找到与范围匹配的数字的对应ID:
SELECT ID FROM BigTable WHERE '5000000' BETWEEN StartRange AND EndRange;
Run Code Online (Sandbox Code Playgroud)
不幸的是,此查询需要几秒钟才能完成。我需要对其进行优化,以使其花费最少的执行时间。我做了一点研究,看起来添加索引似乎无济于事,因为它仅在数字恰好是StartRange或EndRange值时才适用,但在介于两者之间的情况下才适用。
有没有人有任何我可以用来减少执行时间的提示或技巧?理想情况下,我希望它在1秒以下。
我在ip地址范围表中遇到了类似的问题,以下内容确实为我解决了问题。您将需要至少在StartRange上的索引。
SELECT ID
FROM BigTable
INNER JOIN
(SELECT MAX(StartRange) AS start
FROM BigTable
WHERE StartRange <= @Target) AS s
ON StartRange = s.start
WHERE EndRange >= @Target;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1303 次 |
| 最近记录: |