現在の技術スタックでのポーリングで立ち往生しています。 MySQLには、何か新しいものがあることを通知する良い方法がありません。
(たとえば、RabbitMQなどのメッセージキューサブシステムを追加することを検討できますが、その場合は、アプリケーションの構造に大きな変更を加える必要があります)。
可能な限り最小のコストでポーリングを処理するためのいくつかのガイドライン。
-
ミリ秒ではなく、メッセージの待ち時間を数秒に設定します。
-
レイテンシーの期待に応えるために、必要に応じて何度でもクエリを実行してください。
-
各クエリで大量のデータをクエリすることは避けてください。どうすればそれができますか?
a。クエリを実行するたびに最新のタイムスタンプを保存します
b。
SELECT *
は使用しないでください 。代わりに、実際に必要な列の名前を付けてください。これにより、MySQLのオプティマイザはクエリのコストを削減するのに役立ちます。c。クエリに
SELECT whatever WHERE timestamp > saved_timestamp ORDER BY timestamp
したがって、テーブルから順番に新しいアイテムを取得するだけです。システムがあまりビジーでない場合、これらのSELECTは多くの場合行を返しません。いいですね。d。 SELECTステートメントのタイムスタンプと他の列に複数列のインデックスがあることを確認してください。これはカバーインデックスと呼ばれます 。
e。 MySQLへの接続を開いた直後に、このSQLステートメントを発行します。これにより、MySQLは、テーブルに行を挿入する他のMySQLクライアントとの競合を少なくしてデータをフェッチできます。
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
ユーザーのブラウザからAJAXを使用してこれを行う場合は、AJAXリクエストに最新のタイムスタンプを含めて、新しい必要な新しいアイテムを各ユーザーのブラウザに配信できるようにします。