2014-12-05 41 views
0

我有一個mySQL表格,每個條目代表一個玩家在特定的撲克牌手中的表現。重要的專欄是玩家和網絡。我希望建立一個「高分榜」頁面,根據總獎金顯示最好的玩家,並根據遊戲類型,時間等進行過濾。我用下面的查詢來達到的這樣:加快排名查詢

SELECT player,sum(net) AS profit FROM hands GROUP BY player ORDER BY profit DESC 

不幸的是我有很多的記錄,超過200萬迄今爲止,這是查詢極其緩慢。我在「玩家」上放置了一個索引,但執行時間仍然超過7秒。有沒有希望加快mySQL的速度,還是必須以不同的方式構建這個頁面?如果後者有任何建議?

+0

是否需要顯示所有玩家?嘗試添加一個LIMIT子句。 – NewInTheBusiness 2014-12-05 01:09:12

+0

不,但限制不會影響性能。 – Abovestand 2014-12-05 01:14:05

+0

否則我會建議一個預聚合表,但是由於您正在考慮基於遊戲類型,時間範圍的限制,除非存在更多常量的查詢標準基礎,否則這些限制將超出窗口。 – DRapp 2014-12-05 04:57:12

回答

1

一種可能是試試這個:

select p.*, 
     (select sum(net) from hands h where h.player = p.player) as profit 
from players p 
order by profit desc; 

然後,你需要hands(player, net)的索引。這可以通過將聚合移動到可以更好地使用索引的子查詢中。

如果這不起作用,您可能會減少正在考慮的玩家集合 - 例如,只有在過去一週玩過的玩家。作爲最後的選擇,您可能需要更改表格的結構。特別是,請考慮使用hands表中的觸發器添加保持最新的彙總表。