あなたのテーブルが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をトリガーするオプションがありますが、これはほとんどの状況でやり過ぎのようです。