Оптимизация запросов MySQL с тяжелыми объединениями
Я в настоящее время управляю сайтом, который отслеживает самые последние оценки и оценки в списке. Список содержит тысячи записей, которые часто обновляются, и список должен сортироваться по этим столбцам оценок и оценок.
Мой SQL для получения этих данных в настоящее время выглядит (примерно):
SELECT e.*, SUM(sa.amount) AS score, AVG(ra.rating) AS rating
FROM entries e
LEFT JOIN score_adjustments sa ON sa.entry_id = e.id
HAVING sa.created BETWEEN ... AND ...
LEFT JOIN rating_adjustments ra ON ra.entry_id = e.id
HAVING ra.rating > 0
ORDER BY score
LIMIT 0, 10
Где таблицы (упрощенно):
entries:
id: INT(11) PRIMARY
...other data...
score_adjustments:
id: INT(11), PRIMARY
entry_id: INT(11), INDEX, FOREIGN KEY (entries.id)
created: DATETIME
amount: INT(4)
rating_adjustments:
id: INT(11), PRIMARY
entry_id: INT(11), INDEX, FOREIGN KEY (entries.id)
rating: DOUBLE
Есть около 300 000score_adjustments
записи, и они растут около 5000 в день.rating_adjustments
составляет около 1/4 этого.
Теперь я не эксперт DBA, но я угадываюSUM()
а такжеAVG()
все время не очень хорошая вещь, особенно когдаsa
а такжеra
содержат сотни тысяч записей - верно?
Я уже выполняю кеширование запроса, но я хочу, чтобы сам запрос был быстрым, но в то же время обновлялся, насколько это возможно. Мне было интересно, если кто-нибудь может поделиться какими-либо решениями для оптимизации тяжелых запросов объединения / агрегации, как это? Я готов внести структурные изменения, если это необходимо.
EDIT 1
Добавлена дополнительная информация о запросе.