7

私はオンラインのiPhoneターン制ゲームを持っており、同時にたくさんのゲームが実行されています。私とサーバーの両方が今日クラッシュしたので、私はコードを最適化する過程にあります。

これはセットアップです:

現在、すべてのアクティブな一致を追跡する1つのテーブル「一致」(各行に70フィールドのデータ。構造)があります。7秒ごとに、iphoneが接続し、アクティブになっている「一致」テーブルのすべての一致をダウンロードして、iphoneのUIを更新します。

これは、約1,000人がゲームをダウンロードしてプレイするまではうまく機能しました。サーバーがクラッシュしました。

したがって、最適化するために、「matches_needs_update」という新しいテーブルを作成できると思います。このテーブルには2つの行があります。名前とID。「id」は「matches」テーブルの一致と同じです。一致が更新されると、このテーブルに配置されます。

ここで、「一致」テーブル全体を検索する代わりに、クエリは、プレーヤーに更新が必要な一致があるかどうかを確認し、「一致」テーブルからそれらの一致を取得します。

私の質問は2つあります:

  1. これは最適なソリューションですか?
  2. プレーヤーがアクティブな場合、たとえば10試合で、「試合」テーブルからそれらの10試合を同時に取得する良い方法はありますか、または試合ごとに1つずつ、10クエリを実行するforループが必要ですか?

    「SELECT*FROMはWHEREid=?に一致します」

前もって感謝します

4

4 に答える 4

7

データベースから抜け出す必要があります。memcacheまたはredisを探してください。

于 2012-04-26T19:57:18.667 に答える
6

私はAPCを提案します...

... PHPを使用しているので、単一のmysqlデータベースからこれを実行していると思います。

インストールは簡単で、PHP6以降はデフォルトになります。

この1つのテーブルをメモリに保存すると、飛行します。

于 2012-04-26T19:58:54.020 に答える
2

あなたのデータベースは本当に小さく見えます。70行のテーブルはミリ秒以内に返され、1秒あたり数百のクエリでも問題なく機能するはずです。

従来のポインタのカップル

  • 必ず接続をプールしてください。顧客がデータを必要とするときに接続を行う必要はありません。
  • 結果がインデックスからフェッチされるように、「ユーザーは一致しています」にインデックスがあることを確認してください。
  • 構造全体をキャッシュに保持するのに十分なメモリがあると確信しています。これらの小さなテーブルでは、追加の構成は必要ありません。
  • スキーマが正規化されていることを確認してください。ユーザーごとに1つのテーブル。試合ごとに1つ。そして、試合の各ユーザーに1つ。
于 2012-04-26T20:05:13.777 に答える
1

memcacheやapcなどのキャッシュを開始するときです。

試合をループすることに関しては...それはそれについて行く間違った方法です。

ユーザーは外部参照テーブルによってどのように試合に接続されますか?または、マッチテーブルにplayer1、player2のようなものがありますか。

クエリをループすることは、テーブルのインデックスを適切に作成する方法ではなく、結合を実行してuserIdによってすべてのアクティブな一致をプルする方が効率的です。アクティブなゲームと非アクティブなゲームのためにテーブルを分割することもできます(まだ持っていない場合)ユーザーの数を示します。

6000のアクティブなゲームと3,000,000の非アクティブなゲームがある場合、これらのテーブルを分割することは非常に有益です。

于 2012-04-26T20:13:39.363 に答える