【发布时间】:2012-10-03 08:47:26
【问题描述】:
我有一张如下所示的表格:
ID StartRange EndRange
----------------------------
1 1 3
2 4 8
3 9 12
以此类推,这样就有超过 500 万条记录。最后一条记录如下所示:
ID StartRange EndRange
---------------------------------
5235976 9894727374 9894727378
换句话说,StartRange 和 EndRange 对于每条记录永远不会重叠。
我需要做一个查询,找到与范围匹配的数字的对应 ID:
SELECT ID FROM BigTable WHERE '5000000' BETWEEN StartRange AND EndRange;
很遗憾,此查询需要几秒钟才能完成。我需要对其进行优化,使其花费最少的执行时间。我做了一些研究,似乎添加索引没有帮助,因为它仅适用于数字恰好是 StartRange 或 EndRange 值,但不是介于两者之间。
有没有人可以使用任何提示或技巧来缩短执行时间?理想情况下,如果可能的话,我希望它在 1 秒以下。
【问题讨论】:
-
您当前的表架构是什么? (
SHOW CREATE TABLE your_table的输出) -
你也可以发布
DESCRIBE SELECT ID FROM BigTable WHERE '5000000' BETWEEN StartRange AND EndRange的输出吗?这将显示您的索引(x|ces)是否被使用。 -
当然,输出是这样的:
1 SIMPLE BigTable ALL ID,StartRange,EndRange 5522123 Using where -
如果您创建@Jocelyn 的回答中描述的索引,您会得到相同的结果,还是现在使用密钥?我跑了一个小测试用例,确实按照
explain使用了key。 -
我刚刚试过了,
EXPLAIN的输出是一样的。
标签: mysql sql optimization