MySQL группировать по + порядку непонятно медленно - PullRequest
5 голосов
/ 05 апреля 2019

Я не уверен, что происходит, но, на мой взгляд, 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

Execution plan with ORDER BY

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

Execution plan without ORDER BY

Я вижу в плане выполнения,при использовании ORDER BY ..

существует дополнительная сортировка файлов + временная.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...