Optymalizacja zapytań MySQL za pomocą ciężkich połączeń

Obecnie prowadzę witrynę, która śledzi najnowsze wyniki i oceny na liście. Lista zawiera tysiące wpisów, które są często aktualizowane, a lista powinna być sortowana według tych kolumn punktacji i ocen.

Mój SQL do pobierania tych danych wygląda obecnie (mniej więcej):

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

Gdzie są tabele (uproszczone):

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

Jest około 300 000score_adjustments wpisy i rosną o około 5000 dziennie. Therating_adjustments to około 1/4.

Teraz nie jestem ekspertem od DBA, ale zgaduję, że dzwonięSUM() iAVG() cały czas nie jest dobrze - zwłaszcza gdysa ira zawierają setki tysięcy rekordów - prawda?

Już wykonuję buforowanie zapytania, ale chcę, aby zapytanie było szybkie - a jednak tak aktualne, jak to możliwe. Zastanawiałem się, czy ktokolwiek może udostępniać jakiekolwiek rozwiązania w celu optymalizacji takich zapytań w przypadku ciężkiego łączenia / agregacji? Jestem gotów wprowadzić zmiany strukturalne, jeśli to konieczne.

EDYTUJ 1

Dodano więcej informacji o zapytaniu.

questionAnswers(2)

yourAnswerToTheQuestion