У меня возникла проблема с MySQL JOIN и SUM. Поскольку мой JOIN имеет несколько совпадений, я сделаю SELECT в JOIN, поэтому он не будет судить о многом.Проблема с MySQL JOIN и SUM
Проблема:
Мой запрос очень медленный. В тестовой настройке ниже он работает всего за 1 мс без каких-либо индексов. Но в моей производственной базе данных этот запрос занимает ~ 4 секунды при выборе только одной записи (WHERE id = X
).
Таблица а имеет ~ 700.000 записей
Таблица B имеет ~ 800.000 записей
Таблица С имеет ~ 45.000 записей
Таблица а имеет индекс по 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
запрос:
Теперь, когда я запускаю этот запрос, чтобы получить сумму b
и c
, которые имеют ссылку в таблице a
.
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;
Нет индексов на 'a_id' либо' 'b' или c'? – eggyal