Оптимальный SQL-запрос при заказе по суммам - PullRequest
1 голос
/ 26 сентября 2011

Как примечание, этот вопрос является расширением одного из моих предыдущих вопросов. Параметры изменились, поэтому мне нужен новый ответ.

У меня есть таблица MySQL, в которой есть четыре поля: post_id (уникальный int), user_id (int), категория (varchar), score (int).

Моя цель - получить два значения, одно из которых состоит в процентахсообщений пользователя в категории "х".Второй - сумма всех баллов в этой категории «х».Для этого я предположил, что мне нужно получить три значения из MySQL:

  • SUM (score) GROUP BY category
  • COUNT (post_id) GROUPBY category
  • COUNT (post_id)

Так что это достаточно простой запрос для написания.Вот сложная часть: мне нужно получить 50 лучших пользователей, упорядоченных по некоторым подсчетам вроде (процент + сумма).Я предполагаю, что я мог бы написать запрос, который выполняет всю вышеприведенную математику в подзапросе / JOIN, а затем просто поместить ORDER BY и LIMIT в основной запрос, но это кажется неэффективным.Я планирую 2 миллиона пользователей, и каждый пользователь может иметь 5000 сообщений.Если бы я выполнял свой запрос таким образом (я думаю), потребовалось бы навсегда , чтобы выполнить каждую из этих записей.

Какой самый эффективный способ выполнить запрос, подобный этому?Я читал о представлениях MySQL, которые кажутся хорошей идеей, но я также читал, что у них огромные проблемы с производительностью.Стоит ли это?

Или это невозможно?Должен ли я соглашаться на работу CRON пару раз в день и просто хранить ложные числа в реальном времени?

1 Ответ

1 голос
/ 26 сентября 2011

У вас уже есть большая пользовательская база данных и много постов?

Если нет, вы можете создать мета-таблицу, которая отслеживает эти суммы и подсчеты.Их было бы легко обновить в режиме реального времени, когда пользователь добавляет сообщение или оценку.Вам не нужно будет сканировать БД каждый раз, когда вам нужно пересчитать записи и оценки для статистики, потому что у вас уже есть их в таблице.Вместо этого было бы легко сделать расчеты по этой таблице.

Вначале при создании функций, добавляющих все в мета-таблицу, требуется немного больше работы.Но это, вероятно, окупится в долгосрочной перспективе.

...