2

プッシャーで作成したチャットルーム アプリケーションがあります。データベース(MySQL)に最後の10メッセージを保存したいと思います。そのため、頻繁に書き込みが発生します。ただし、保存されるのは 10 件だけで、古いメッセージはすべて削除されます。

例:

  1. メッセージ 1 から 10 はデータベースに保存されます
  2. メッセージ 11 が着信し、メッセージ 1 が削除されます

これらの最後の 10 件のメッセージは、ユーザーが初めてチャットルームにアクセスしてログインしたときにのみ取得されるため、チャットルームの最新のメッセージをさかのぼって読むことができます。

これを行うための一般的な「慣行」や、より良い方法はありますか?

4

3 に答える 3

0

これに最適な MySQL ソリューションは次のとおりです...

まず、テーブルを InnoDB テーブルとして作成し、書き込み時のテーブル ロックを防ぎます。

CREATE TABLE chat_messages (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ....
    message VARCHAR(255) NOT NULL
) ENGINE=InnoDB;

必要に応じて、クエリを実行する前に、トランザクション分離レベルを「read uncommitted」に設定すると、実行前にロックが解放されるのを待機しなくなります。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

次に、id DESC と LIMIT 10 で並べ替えて、最後の 10 レコードをクエリします。これは、クラスター化インデックス (主キー) を使用して並べ替えを行うため、非常に高速です。

SELECT * 
FROM chat_messages
ORDER BY id DESC LIMIT 10

最後に、夜間に cron でクリーンアップ プロセスを実行して、アクティビティが少ないときにチャット メッセージを削除できます。

0 0 * * * mysql -hlocalhost -uusername -ppassword -e "DELETE FROM chat_messages WHERE id < (SELECT MAX(id) - 10 FROM chat_messages)"
于 2013-05-25T19:11:24.250 に答える
0

上記のどちらかで行きたいと思っています。

または、挿入時にトリガーを使用して、レコードが 10 件を超える場合にレコードを削除することもできます。

または、スケジュールされたクリーンアップ ジョブで cron ジョブにアクセスできない場合は、MySQL 内でスケジュールされたイベントを使用できます。

于 2013-05-25T19:34:47.310 に答える