2012-04-26 44 views
7

我有一個在線iphone turnbased遊戲,有很多遊戲在同一時間運行。我正在優化代碼,因爲我和服務器今天都崩潰了。1.3M查詢/小時。你將如何構建查詢?

這是設置:

現在我有一個表,「匹配」(70場每一行數據的結構。),即跟蹤所有的活動比賽。每7秒鐘,iphone將連接,下載他/她所在的「匹配」表中的所有匹配項,並更新iphone中的UI。

這工作很好,直到大約1000人下載遊戲並播放。服務器崩潰。

因此,爲了優化,我想我可以創建一個名爲「matches_needs_update」的新表。這張桌子有兩排;名稱和ID。 「id」與「matches」表中的匹配相同。當比賽更新時,它被放在這張桌子上。

現在,而是通過整個「匹配」表搜索,查詢只檢查,如果玩家有需要更新的任何比賽,然後從「匹配」表中獲取這些比賽。

我的問題是雙重的:

  1. 這是最佳的解決方案?
  2. 如果一個玩家在10個比賽中活躍,是否有一種很好的方法可以同時從「比賽」表中獲得這10個比賽,或者我需要一個for循環做10個查詢,每個匹配:

    「SELECT * FROM matches WHERE id =?」

在此先感謝

+6

雖然問題嚴重,但如果您仔細考慮,這是您遇到的最佳問題之一。來自太多實際用戶的崩潰是最好的一種崩潰。 – Cyclone 2012-04-26 19:57:24

+1

使用推送通知的解決方案可能是解決性能問題的更好方法。這樣你就不會有很多冗餘的轉彎檢查 – 2012-04-26 19:57:38

+1

它幾乎聽起來像1人可以在多場比賽中活躍,並且多人可以在1場比賽中活躍?當然,你必須有3桌? – DanRedux 2012-04-26 20:08:16

回答

6

我建議APC ...

...因爲您是在PHP,我假設你從一個單一的MySQL數據庫這樣做,

它易於安裝,將從PHP 6開始默認。

將這張表保存在內存中,它會飛。

+0

感謝您的回覆。我是否需要更新所有的php代碼來處理它,還是隻是爲了安裝?謝謝 – BlackMouse 2012-04-26 21:16:04

+0

APC是2件事。它是一個操作碼緩存(緩存PHP代碼以便加載更快)以及內存存儲(即鍵值)。第一部分自動發生,並提高速度。但你對第二點感興趣。所以是的 - 你需要更新你的代碼。閱讀我鏈接的手冊頁面,並從apc_store開始獲取此主意。 – HappyTimeGopher 2012-04-27 09:23:11

7

你需要走出的數據庫。看看memcache或redis。

2

你的數據庫看起來很小。一個包含70行的表應該在毫秒內返回,甚至每秒幾百個查詢應該可以毫無問題地工作。

一對夫婦的傳統指針

  • 的確保你集中你的連接。當客戶需要數據時,您絕不應該進行連接。
  • 確保「user is in match」上有一個索引,以便從索引中獲取結果。
  • 我相信你有足夠的內存來保存緩存中的整個結構,並且這些小表不需要額外的配置。
  • 確保您的模式已標準化。每個用戶一張桌子。每場比賽一場。還有一個用於比賽中的每個用戶。
1

它的時候開始緩存的東西如內存緩存和APC。

至於循環雖然比賽......這是錯誤的方式去做。

如何用戶通過一個外部參照TABEL連接到匹配?或者比賽表是否有像player1,player2這樣的東西。

循環雖然查詢是不是要正確索引你的表,做一個參加由用戶名字我會更有效地拉動所有活動比賽的方式。 Givin您可能還想要的用戶數量(如果您沒有)將表格分爲活動和非活動遊戲。

如果那裏有6000個活動性遊戲至3,000,000無活性的極爲有利劃分這些表。