Я не уверен, что происходит, но, на мой взгляд, MySQL должен справиться с этим очень хорошо.
У меня SQL такой, как этот.
SELECT u.id AS user_id, SUM(t.amount) AS total
FROM user u
INNER JOIN transaction t ON t.user_id = u.id
WHERE u.condition = true
GROUP BY u.id
ORDER BY total DESC;
Этот запрос выполняется в течение 10 секунд.
Если я удалю предложение ORDER BY, время будет около 4 секунд.
Таблицы очень большие, но после GROUP BY у меня только 40 строк.Действительно ли для сортировки 40 строк требуется 6 секунд?Я бы сказал, что это должно быть обработано оптимизатором.
Однако, если я выполню запрос следующим образом:
SELECT *
FROM (
SELECT u.id AS user_id, SUM(t.amount) AS total
FROM user u
INNER JOIN transaction t ON t.user_id = u.id
WHERE u.condition = true
GROUP BY u.id
) data
ORDER BY total DESC;
Этот запрос выполняется в течение 4 секунд.Я понимаю, что заставил MySQL отсортировать только 40 записей, извлеченных из внутреннего выбора.
Я действительно не понимаю одну вещь.MySQL не может отсортировать по сумме до GROUP BY. Так что же сильно замедляет запрос?
В этом случае я могу использовать второй запрос, но если бы у меня был другой внутренний SQL, MySQL начал бы создавать временные таблицы иэто убило бы производительность, может быть, больше, чем ORDER BY.Еще одна «проблема» заключается в том, что я использую ORM, а использование необработанного SQL очень болезненно.
Спасибо за предложения.
РЕДАКТИРОВАТЬ:
План выполнения с ORDER BY

План выполнения без ЗАКАЗА ПО *

Я вижу в плане выполнения,при использовании ORDER BY ..
существует дополнительная сортировка файлов + временная.