Как оптимизировать оператор JOIN и AVG для таблицы рейтингов - PullRequest
0 голосов
/ 08 декабря 2011

У меня в основном две таблицы: таблица 'server' и таблица 'server_ratings'.Мне нужно оптимизировать текущий запрос, который у меня есть (он работает, но это занимает около 4 секунд).Есть ли способ, которым я могу сделать это лучше?

SELECT ROUND(AVG(server_ratings.rating), 0), server.id, server.name
FROM server LEFT JOIN server_ratings ON server.id = server_ratings.server_id
GROUP BY server.id;

Ответы [ 2 ]

1 голос
/ 08 декабря 2011

Запрос выглядит нормально, но убедитесь, что у вас есть правильные индексы :

  • для id столбца в таблице server - возможно, первичный ключ,
  • в столбце server_id в таблице server_ratings,

Если это не поможет, тогда добавьте столбец rating в таблицу server и рассчитайте его на постоянной основе (см. этот ответ о заданиях Cron ).Таким образом вы сэкономите время, которое вы тратите на расчеты.Они могут быть сделаны отдельно, например.каждую минуту, но, вероятно, некоторых менее частых вычислений достаточно (в зависимости от того, насколько динамичны ваши данные).

Также убедитесь, что вы запрашиваете правильную таблицу - в вопросе вы упомянули таблицу servers, но в кодеесть ссылка на server таблицу.Вероятно, опечатка:)

0 голосов
/ 08 декабря 2011

Это должно быть немного быстрее, потому что сначала выполняется агрегатная функция, что приводит к меньшему числу операций JOIN.

SELECT s.id, s.name, r.avg_rating
FROM   server s
LEFT   JOIN (
    SELECT server_id, ROUND(AVG(rating), 0) AS avg_rating
    FROM   server_ratings
    GROUP  BY server_id
    ) r ON r.server_id = s.id

Но главная точка - это соответствующие индексы . Первичные ключи индексируются автоматически. Убедитесь, что у вас есть один на server_ratings.server_id тоже.

...