Si votre table est MyISAM, je m'en tiendrai à votre idée initiale. Obtenir le nombre de lignes d'une table MyISAM est instantané. Il suffit de lire une seule valeur car MyISAM maintient le nombre de lignes à tout moment.
Avec InnoDB, cette approche peut toujours être acceptable. En supposant car_table.id
est la clé primaire, SELECT COUNT(id) FROM car_table
ne nécessite qu'une analyse d'index, ce qui est très rapide. Vous pouvez améliorer cette idée en ajoutant une autre colonne booléenne indexée à votre table :
ALTER car_table ADD COLUMN checked BOOLEAN NOT NULL DEFAULT 0, ADD INDEX (checked);
La valeur par défaut garantit que les nouvelles voitures seront insérées avec cet indicateur défini sur 0 sans modifier l'instruction d'insertion. Ensuite :
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;
De cette façon, vous n'analysez qu'un très petit nombre d'entrées d'index à chaque interrogation.
Une approche plus avancée consiste à ajouter des ID de voitures nouvellement créées dans une table latérale, via un déclencheur. Cette table d'appoint est scannée de temps en temps, sans verrouiller la table principale, et sans altérer sa structure. Simplement TRUNCATE
cette table d'appoint après chaque scrutin.
Enfin, il existe la possibilité de déclencher un UDF, comme suggéré par Panagiotis, mais cela semble exagéré dans la plupart des situations.