1

私はランキングアプリを作成しており、次のようにランキングでユーザーの位置を取得しています。

$sql = "SELECT fk_player_id FROM ".$prefix."_publicpoints
            WHERE date BETWEEN '2013-01-01' AND '2013-12-31'
                GROUP BY fk_player_id
            HAVING SUM(points) > 235";

これは正常に機能していますが、1つの欠点があります。500.000ユーザーのランキングがある場合、クエリはかなり重くなる可能性があります。次に、235よりも高いポイントを持つすべてのユーザーを実行する必要があります。235が#345.879としてポスションを与えるとしましょう。それはたくさんの行です...どうすればこれをより良い方法で行うことができますか?少なくともdbを呼び出すときは?

事前に4つの助けと感謝を願っています:-)

4

1 に答える 1

1

状況に応じてそれらを組み合わせることができる(または組み合わせる場合としない場合がある)3つの可能な解決策

  • ランキング列にインデックスを追加する
  • ランクが変化した場合にのみランクを事前計算する
  • cron ジョブを使用してランクを事前に計算します。10 分遅れても問題ありません。

一般的なランキング ページの場合は、テンプレート エンジンを使用してページを事前にレンダリングし、キャッシュすることができます。

より多くのRAMを使用するか、クエリと一時テーブルのキャッシュを構成することで、mysqlのパフォーマンスを最適化できる場合があります

于 2013-02-10T16:22:16.963 に答える