1

ターンベースのゲーム(PHPとMySQLを使用)のチャットを作成しています。このチャットでは、最新の30件のメッセージのみをMySQLデータベースに保存します。

現在、カウントが30を超えたときに最も古いメッセージを削除するために、3つのクエリを実行しています。

  1. 新しいチャットメッセージを新しい行として挿入します。

    INSERT INTO chatMessages(userId、matchId、message、timestamp)VALUES("。$params ["userId "]。"、"。$ params ["matchId "]。"、'"。$params["message"]。" '、今())

  2. データベースにメッセージが多すぎるかどうかを確認し、最も古いメッセージのIDを取得します。

    SELECT COUNT(id)AS count、id AS oldestId FROM chatMessages WHERE matchId="。$params["matchId"]。" ORDER BY id ASC LIMIT 1

  3. 最も古いメッセージを削除する

    DELETE FROM chatMessages WHERE id="。$oldestId

2つまたは1つの単一のクエリでこれを行う方法はありますか?サーバーにはかなりの量のトラフィックがあるため、パフォーマンスが重要です。

4

1 に答える 1

0

2番目と3番目のクエリを1つに減らすことができます。

delete from chatMessages 
where id not in (select id from chatMessages 
                 order by id desc 
                 limit 30)

これを挿入トリガーに入れることができます。そうすれば、最も古いレコードは挿入後に自動的に削除されます。

于 2012-06-03T12:25:40.257 に答える