Можно ли ускорить этот запрос?

Есть mysql таблица с 10млн записями, вида:
id, user_id, value

Нужно вывести в порядке убывания сумму value каждого пользователя, сейчас делаю так:
SELECT table.user_id, SUM(table.value) as value_sum FROM table GROUP BY table.user_id ORDER BY value_sum DESC LIMIT 5;

Но запрос очень долго выполняется, ждал 30 минут так и не вывел ничего, возможно ли это как-то ускорить?
  • Вопрос задан
  • 210 просмотров
Решения вопроса 1
xpert13
@xpert13
Full Stack Developer
По доброму, если вам нужна такая информация, то сумму для каждого пользователя необходимо считать в отдельной таблице (или таблице пользователей) и пересчитывать её каждый раз, когда добавляется новая запись в таблицу table. Тогда пересчет будет происходить для каждого пользователя отдельно и только тогда, когда что-то меняется.

Альтернативный вариант, но менее эффективный - создать виртуальную таблицу для запроса:
SELECT table.user_id, SUM(table.value) as value_sum FROM table GROUP BY table.user_id

И уже из неё делать выборку с сортировкой и лимитом. Такую таблицу MySQL будет пересчитывать сама при каких-либо изменениях в таблице table, но я не уверен на сколько это будет быстро работать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
veshetu
@veshetu
web-dev
индексы делал?
план запроса посмотри.

если можно итерациями счиатать и сохранять в промежуточной таблице.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы