【发布时间】:2019-09-10 15:07:52
【问题描述】:
我一直在尝试优化我已经成功完成的查询的性能。使用左连接的时间从 36.7 秒缩短到了 3.3 秒,但我不太明白为什么左连接与普通连接相比性能有如此大的提升。
两个查询买回的结果集是相同的。
这里是带有 EXPLAIN 的查询...
正常加入:36.7 秒
SELECT t1.entityId, SUM(t2.gbp) AS amount
FROM transactionsV2 t1
JOIN
(
SELECT
t.uniqueId,
ROUND((CASE WHEN t.currency != "GBP" THEN t.amount/er.exchange_rate ELSE t.amount END), 2) AS gbp
FROM transactionsV2 t
JOIN total_control.exchange_rates er
ON t.currency = er.currency
) t2
ON t1.uniqueId = t2.uniqueId
WHERE t1.paymentType IN ("DB", "3D")
AND t1.processing_time >= '2019-04-01 00:00:00'
AND t1.processing_time <= '2019-04-20 23:59:59'
AND t1.status = 1
GROUP BY t1.entityId
左加入:3.3 秒
SELECT t1.entityId, SUM(t2.gbp) AS amount
FROM transactionsV2 t1
LEFT JOIN
(
SELECT
t.uniqueId,
ROUND((CASE WHEN t.currency != "GBP" THEN t.amount/er.exchange_rate ELSE t.amount END), 2) AS gbp
FROM transactionsV2 t
JOIN total_control.exchange_rates er
ON t.currency = er.currency
) t2
ON t1.uniqueId = t2.uniqueId
WHERE t1.paymentType IN ("DB", "3D")
AND t1.processing_time >= '2019-04-01 00:00:00'
AND t1.processing_time <= '2019-04-20 23:59:59'
AND t1.status = 1
GROUP BY t1.entityId
【问题讨论】:
-
你一个接一个地执行了这两个查询? ...尝试反转序列..
-
我试过了,但结果还是一样。我也在不同的浏览器中运行了查询,所以不要认为这与缓存有任何关系。
-
还是一样的@RaymondNijland。这不是缓存问题。
-
好吧,在不知道表结构和索引的情况下,我们不会解决这个问题,那肯定我已经尝试过一个合乎逻辑的答案。你应该在不关闭输出的情况下编辑问题
SHOW CREATE TABLE transactionsV2跨度> -
样本数据和期望的结果真的很有帮助——就像描述查询应该做什么一样。