В вашем запросе нет очевидного антипаттерна производительности запроса. Производительность в значительной степени зависит от производительности двух подзапросов с предложениями group by.
Давайте посмотрим на один из них, чтобы найти некоторые улучшения.
SELECT t.aid AS tuid,
SUM( IF( t.status = 1, t.amount, 0 ) ) AS transactions
FROM afs_transactions AS t
WHERE t.datetime BETWEEN '2018-01-01 00:00:00' AND '2020-01-01 23:59:59'
GROUP BY t.aid
Это будет нормально, если выиметь индекс на afs_transactions.datetime
.
Но весь подзапрос можно переписать
SELECT t.aid AS tuid,
SUM( t.amount ) AS transactions
FROM afs_transactions AS t
WHERE t.datetime BETWEEN '2018-01-01 00:00:00' AND '2020-01-01 23:59:59'
AND t.status = 1
GROUP BY t.aid
В этом запросе будет использован составной индекс для (status, datetime)
. Если у вас много строк со значениями status
, не равными 1
, и у вас есть составной индекс, переписанный запрос будет быстрее.
Pro tip : BETWEEN
дляЗначения datetime, как правило, плохой выбор, потому что, ну, 59:59. Попробуйте использовать <
вместо BETWEEN <=
для конца диапазона.
WHERE t.datetime >= '2018-01-01'
AND t.datetime < '2020-01-02' /* notice, it's the day after the range */