私は現在、最新のスコアと評価をリストで追跡するサイトを運営しています。リストには頻繁に更新される何千ものエントリがあり、リストはこれらのスコアと評価の列で並べ替えることができます。
このデータを取得するための私の 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,000件のscore_adjustments
エントリがあり、1 日あたり約 5,000 件のペースで増加しています。そのrating_adjustments
約1/4です。
さて、私は DBA の専門家ではありませんが、常に呼び出しSUM()
を行うのは良いことではないと推測しています。特に、数十万のレコードが含まれている場合はそうです。AVG()
sa
ra
私はすでにクエリのキャッシュを行っていますが、クエリ自体は高速でありながら、可能な限り最新の状態にしたいと考えています。このような大量の結合/集計クエリを最適化するソリューションを誰かが共有できるかどうか疑問に思っていましたか? 必要に応じて構造変更を行います。
編集1
クエリに関する詳細情報を追加しました。