0

現在取り組んでいる、PHP と MySQL で構築されたプロジェクトに問題があります。プロジェクト自体は、オンライン入札システムに似ています。ユーザーはプロジェクトに入札し、クリックしてもう一度クリックすることで入札に従うと、勝つチャンスが得られます.

問題は次のとおりです。たとえば、5 人のユーザーが同時にゲームに参加すると、データベースで 8 ~ 10 秒の遅延が発生します。UNIX_TIMESTAMP(CURRENT_TIMESTAMP) を使用してデータベースを更新すると、入札のシステム全体が作成されます。使い物にならない。

このプロジェクトは非常にデータベース集約型 (ページあたり約 30 ~ 40 クエリ) であり、クエリが遅延するのではないかと考えていましたが、それが起こっているかどうかはわかりません。もしそうなら、この種の問題を回避する方法はありますか?

この問題について少なくとも明確になったことを願っています。初めてのことなので、よろしくお願いします!

4

2 に答える 2

0

あなたが決めることができます

  1. 必要なクエリの最適化または最小化。
  2. 訪問ごとに更新する必要のないクエリをキャッシュできます。
  3. Summery テーブルを使用できます
  4. クエリを変更時にのみ更新します。

これを巧みに行う必要があります。このMySQLPerformanceBlogをフォローできます

于 2012-12-10T16:52:29.927 に答える
0

私はあなたが何をしているのか明確ではありませんが、あなたが言ったことを詳しく説明させてください. MySQL クエリで UNIX_TIMESTAMP(CURRENT_TIMESTAMP()) を使用している場合、深刻な問題があります。

あなたのアプローチの問題は、データベースに保存されるタイムスタンプ レコードを提供するために MySQL 関数を使用していることです。タイムスタンプが生成される前に、MySQL がクエリを解析して実行するのを待たなければならないため、これは問題です (また、MyISAM などの一部の MySQL エンジンはテーブルレベルのロックを使用します)。他のエンジン (InnoDB など) では、行レベルのロックの粒度が原因で書き込みが遅くなります。これは、行に格納された時間が、その行を挿入するために要求が生成された時間を必ずしも反映していないことを意味します。さらに、データベースから読み取っている時間が必ずしも最新のレコードではないことも意味します (レコードがテーブルに挿入された後にレコードを更新していると仮定します)。

必要なのは、SQL クエリを生成する PHP リクエストが TIMESTAMP を SQL クエリで直接提供することです。つまり、タイムスタンプは PHP がリクエストを受信した時刻を反映しており、必ずしも行がデータベースに挿入/更新された時刻を反映しているわけではありません。

また、テーブルがどの MySQL エンジンを使用しているかを明確にする必要があります。たとえば、 InnoDB のようなエンジンはMVCC ( Multi-Version Concurrency Control ) を使用します。これは、行が読み取られている間、同時に書き込むことができることを意味します。これが発生した場合、データベース エンジンはページ テーブルと呼ばれるものを使用して、新しい値の更新中にクライアントによって読み取られる既存の値を格納します。そうすれば、より高速で安定した読み取りで行レベルのロックが保証されますが、書き込みが遅くなる可能性があります。

于 2012-12-10T17:05:49.600 に答える