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.