Om ditt bord är MyISAM, skulle jag hålla fast vid din ursprungliga idé. Att få radräkningen från en MyISAM-tabell är omedelbar. Det krävs bara avläsning av ett enda värde eftersom MyISAM upprätthåller radantalet hela tiden.
Med InnoDB kan detta tillvägagångssätt fortfarande vara acceptabelt. Förutsatt car_table.id
är primärnyckel, SELECT COUNT(id) FROM car_table
kräver bara en indexskanning, vilket är mycket snabbt. Du kan förbättra denna idé genom att lägga till ytterligare en indexerad boolesk kolumn i tabellen:
ALTER car_table ADD COLUMN checked BOOLEAN NOT NULL DEFAULT 0, ADD INDEX (checked);
Standardvärdet säkerställer att nya bilar kommer att infogas med denna flagga inställd på 0 utan att infogningssatsen ändras. Sedan:
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;
På så sätt skannar du bara ett mycket litet antal indexposter vid varje omröstning.
Ett mer avancerat tillvägagångssätt består i att lägga till nyskapade bil-ID:n i ett sidobord, genom en trigger. Detta sidobord skannas då och då, utan att låsa huvudbordet och utan att ändra dess struktur. Helt enkelt TRUNCATE
denna sidotabell efter varje omröstning.
Slutligen finns det möjlighet att utlösa en UDF, som föreslagits av Panagiotis, men detta verkar vara en överdrift i de flesta situationer.