【发布时间】:2016-12-12 10:43:47
【问题描述】:
我遇到了 MySQL JOIN 和 SUM 的问题。因为我的 JOIN 有多个匹配项,所以我会在 JOIN 中执行一个 SELECT,所以它的总和不会太多。
问题:
我的查询非常慢。在下面的测试设置中,它仅在 1ms 内运行,没有任何索引。但在我的生产数据库中,当仅选择一条记录 (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;
【问题讨论】:
-
在
b或c中的a_id上没有索引?