-3

我有 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

反馈很大,需要很长时间。

4

2 回答 2

2

我建议对查询做一个解释计划。如果您看到 TABLE SCAN,您将知道您必须重写查询以便有效地使用索引。

我猜这是timeCreated杀死你的原因,因为你必须扫描每一行 JOIN 来查看哪一行满足 WHERE 子句。

进行一些减少您需要扫描的集合大小的操作将有很大帮助。使用索引也会有所帮助。确保 WHERE 子句中的列被正确索引,然后重写查询以利用它们。

于 2013-03-21T12:36:58.727 回答
0

除非您能找到为数据添加索引的方法,否则无法加快速度。

目前,您的开销是您在扫描两个表时为每个潜在匹配调用 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
于 2013-03-21T12:42:09.903 回答