Pokud je váš stůl MyISAM, držel bych se vašeho původního nápadu. Získání počtu řádků z tabulky MyISAM je okamžité. Vyžaduje pouze čtení jedné jediné hodnoty, protože MyISAM neustále udržuje počet řádků.
S InnoDB může být tento přístup stále přijatelný. Za předpokladu car_table.id
je primární klíč, SELECT COUNT(id) FROM car_table
vyžaduje pouze skenování indexu, které je velmi rychlé. Tento nápad můžete vylepšit přidáním dalšího indexovaného booleovského sloupce do tabulky:
ALTER car_table ADD COLUMN checked BOOLEAN NOT NULL DEFAULT 0, ADD INDEX (checked);
Výchozí hodnota zajišťuje, že nová auta budou vložena s tímto příznakem nastaveným na 0, aniž by došlo k úpravě příkazu vkládání. Potom:
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;
Tímto způsobem skenujete pouze velmi malý počet položek rejstříku při každém dotazování.
Pokročilejší přístup spočívá v přidávání nově vytvořených ID aut do postranní tabulky pomocí spouště. Tento postranní stůl je každou chvíli skenován, aniž by se zamykal hlavní stůl a neměnila se jeho struktura. Jednoduše TRUNCATE
tuto postranní tabulku po každém hlasování.
Konečně je tu možnost spuštění UDF, jak navrhuje Panagiotis, ale to se zdá být ve většině situací přehnané.