考虑以下 2 个表格:
Table A:
id
event_time
Table B
id
start_time
end_time
表 A 中的每条记录都映射到表 B 中的 1 条记录。这意味着表 B 没有重叠期间。表 A 中的许多记录可以映射到表 B 中的同一记录。
我需要一个返回所有 A.id、B.id 对的查询。比如:
SELECT A.id, B.id
FROM A, B
WHERE A.event_time BETWEEN B.start_time AND B.end_time
我正在使用 MySQL,但无法优化此查询。表 A 中有约 980 条记录,表 B 中有 130.000 条记录,这需要很长时间。我知道这必须执行 980 次查询,但是在一台强大的机器上花费超过 15 分钟是很奇怪的。有什么建议吗?
附:我无法更改数据库架构,但可以添加索引。但是,时间字段上的索引(具有 1 或 2 个字段)没有帮助。
最佳答案
你可能想尝试这样的事情
Select A.ID,
(SELECT B.ID FROM B
WHERE A.EventTime BETWEEN B.start_time AND B.end_time LIMIT 1) AS B_ID
FROM A
如果您在 B 的 Start_Time,End_Time 字段上有一个索引,那么这应该工作得很好。
关于sql - 优化使用 between 子句的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/557425/