Wenn Ihre Tabelle MyISAM ist, würde ich bei Ihrer ursprünglichen Idee bleiben. Das Abrufen der Zeilenanzahl aus einer MyISAM-Tabelle erfolgt sofort. Es muss nur ein einziger Wert gelesen werden, da MyISAM die Zeilenanzahl zu jeder Zeit beibehält.
Bei InnoDB kann dieser Ansatz noch akzeptabel sein. Angenommen car_table.id
ist Primärschlüssel, SELECT COUNT(id) FROM car_table
erfordert nur einen Index-Scan, der sehr schnell ist. Sie können diese Idee verbessern, indem Sie Ihrer Tabelle eine weitere indizierte boolesche Spalte hinzufügen:
ALTER car_table ADD COLUMN checked BOOLEAN NOT NULL DEFAULT 0, ADD INDEX (checked);
Der Standardwert stellt sicher, dass neue Autos eingefügt werden, wenn dieses Flag auf 0 gesetzt ist, ohne die Einfügeanweisung zu ändern. Dann:
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;
Auf diese Weise scannen Sie bei jeder Abfrage nur eine sehr kleine Anzahl von Indexeinträgen.
Ein fortschrittlicherer Ansatz besteht darin, neu erstellte Fahrzeug-IDs über einen Trigger in eine Seitentabelle einzufügen. Dieser Beistelltisch wird von Zeit zu Zeit gescannt, ohne den Haupttisch zu sperren und ohne seine Struktur zu verändern. Einfach TRUNCATE
diese Nebentabelle nach jeder Umfrage.
Schließlich gibt es die Möglichkeit, ein UDF auszulösen, wie von Panagiotis vorgeschlagen, aber das scheint in den meisten Situationen ein Overkill zu sein.