我目前運行一個網站,可以追蹤列表中的最新分數和分數。該列表包含數千個經常更新的條目,並且該列表應該可以通過這些評分和評級列進行排序。通過大量連接優化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
有大約300000個score_adjustments
條目,它們生長在約一天5000個。 rating_adjustments
約爲1/4。
現在,我沒有DBA專家,但我猜打電話SUM()
和AVG()
所有的時間是不是一件好事 - 尤其是當sa
和ra
包含的記錄數以十萬計 - 對嗎?
我已經對查詢進行了緩存,但我希望查詢本身速度快 - 但仍儘可能保持最新。我想知道是否有人可以共享任何解決方案來優化這種重加入/聚合查詢?如果有必要,我願意做出結構上的改變。
編輯1
添加了有關查詢更多信息。
實際查詢會更好。 –
幾個索引通常會這樣做,但沒有表結構,當前索引,實際查詢和數據量,這是瘋狂的猜測。我們得到這一切後,這只是猜測。 – GolezTrol
@ypercube添加了查詢的關閉表示 – Ryall