我有2个表,它们都有大约300000个值。由于技术原因,我们不能直接匹配时间戳或唯一的ID。
但是我们想要获取这个结果:
SELECT * FROM adsDelivered
JOIN pageViews ON (
adsDelivered.session = pageViews.session and
adsDelivered.referer = pageViews.referer and
abs(unix_timestamp(adsDelivered.timeCreated) - unix_timestamp(pageViews.timeCreated)) <= 5
)
WHERE pageViews.timeCreated >= '2013-03-21 00:00:00' and
pageViews.timeCreated <= '2013-03-21 23:59:59'
LIMIT 100
反馈太大,耗时太长
我建议对查询执行EXPLAIN PLAN。如果您看到一个TABLE SCAN,您将知道您必须重写查询,以便您有效地使用索引。
我猜是timeCreated
杀死了你,因为你必须扫描每一个JOIN行,看看哪一个满足WHERE子句。
进行一些操作,减少需要扫描的数据集的大小,这将大有帮助。使用索引也会有所帮助。确保WHERE子句中的列被正确索引,然后重写查询,以便它利用它们。
除非你能找到一种方法为你的数据添加索引,否则没有办法加快速度。
目前,您的开销是在扫描两个表时为每个潜在匹配调用abs和unix_timestamp。
我唯一的建议是解释计划,看看发生了什么,它可能是次优优化,你可以通过不使用join来改进事情,而使用where子句,像这样:
SELECT *
FROM adsDelivered, pageViews
WHERE adsDelivered.session = pageViews.session
AND adsDelivered.referer = pageViews.referer
AND abs(unix_timestamp(adsDelivered.timeCreated) - unix_timestamp(pageViews.timeCreated)) <= 5
AND pageViews.timeCreated >= '2013-03-21 00:00:00'
AND pageViews.timeCreated <= '2013-03-21 23:59:59'
LIMIT 100