Оптимизация запросов 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

Добавлена дополнительная информация о запросе.

Ответы на вопрос(2)

Ваш ответ на вопрос