sql >> データベース >  >> RDS >> Mysql

新しい行がMySQLテーブルに追加されたかどうかをリアルタイムでチェックする方法

    あなたのテーブルがMyISAMの場合、私はあなたの最初のアイデアに固執します。 MyISAMテーブルから行数を取得するのは簡単です。 MyISAMは常に行数を維持するため、1つの値を読み取るだけです。

    InnoDBを使用しても、このアプローチは引き続き受け入れられます。 car_table.idを想定 主キー、SELECT COUNT(id) FROM car_table 非常に高速なインデックススキャンのみが必要です。テーブルに別のインデックス付きブール列を追加することで、このアイデアを改善できます。

    ALTER car_table ADD COLUMN checked BOOLEAN NOT NULL DEFAULT 0, ADD INDEX (checked);
    

    デフォルト値は、挿入ステートメントを変更せずに、このフラグを0に設定して新しい車が挿入されることを保証します。次に:

    BEGIN TRANSACTION; -- make sure nobody interferes
    SELECT COUNT(checked) FROM car_table WHERE checked = FALSE FOR UPDATE; -- this gets you the number of new, unchecked cars
    UPDATE car_table SET checked = TRUE WHERE checked = FALSE; -- mark these cars as checked
    COMMIT;
    

    このように、各ポーリングでスキャンするインデックスエントリの数はごくわずかです。

    より高度なアプローチは、トリガーを介して、新しく作成された車のIDをサイドテーブルに追加することです。このサイドテーブルは、メインテーブルをロックしたり、構造を変更したりすることなく、時々スキャンされます。単にTRUNCATE 各ポーリング後のこのサイドテーブル。

    最後に、Panagiotisによって提案されているように、UDFをトリガーするオプションがありますが、これはほとんどの状況でやり過ぎのようです。



    1. すべての子ノードを削除するPHP再帰関数により、stackoverflowが発生します

    2. MicrosoftAccessランタイムを使用する際の落とし穴

    3. MySQLが最適なインデックスを使用しないのはなぜですか

    4. mysqlで友達リストを設定する