我在 MySQL JOIN 和 SUM 方面遇到问题。因为我的 JOIN 有多个匹配项,所以我将在 JOIN 中执行 SELECT,这样总和就不会太多。
问题:
我的查询速度非常慢。在下面的测试设置中,在没有任何索引的情况下,它的运行时间仅为 1 毫秒。但在我的生产数据库上,当仅选择一条记录 (WHERE id = X
) 时,此查询大约需要 4 秒。
表 a 有约 700.000 条记录
表 b 有约 800.000 条记录
表 c 有约 45.000 条记录
表a在id
上有索引
表 b 在 id
、a_id
上有索引
表 c 在 id
、a_id
下面是简化的表格和使用的查询。
表a
id
---
1
表b
id | a_id | amount | price
--------------------------
1 | 1 | 1 | 25
2 | 1 | 1 | 20
表c
id | a_id | amount | price
--------------------------
1 | 1 | 1 | 23
2 | 1 | 1 | 20
查询:
现在,当我运行此查询来获取表 a
中引用的 b
和 c
的总和时。
SELECT id, bPrice, cPrice
FROM a
LEFT JOIN (SELECT a_id, SUM(amount * price) AS bPrice FROM b GROUP BY a_id) bb ON a.id = bb.a_id
LEFT JOIN (SELECT a_id, SUM(amount * price) AS cPrice FROM c GROUP BY a_id) cc ON a.id = cc.a_id
结果错误但速度很快
SELECT
a.id,
SUM(b.amount * b.price) AS bPrice,
SUM(c.amount * c.price) AS cPrice
FROM a
JOIN b ON a.id = b.a_id
JOIN c ON a.id = c.a_id;
最佳答案
MySQL 将很难从子查询中提取索引来进行连接,并且怀疑您正在连接子查询中的大量行。
作为第一步,您可以尝试删除其中一个子查询,将其更改为针对主表的联接。
SELECT id,
SUM(b.amount * b.price) AS bPrice,
cPrice
FROM a
LEFT OUTER JOIN b ON a.id = b.a_id
LEFT OUTER JOIN
(
SELECT a_id,
SUM(amount * price) AS cPrice
FROM c
GROUP BY a_id
) cc ON a.id = cc.a_id
GROUP BY a.id,
cc.cPrice
关于MySQL JOIN 和 SUM 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41099026/