Ако вашата маса е MyISAM, бих се придържал към първоначалната ви идея. Получаването на броя на редовете от MyISAM таблица е незабавно. Необходимо е само четене на една единствена стойност, тъй като MyISAM поддържа броя на редовете през цялото време.
С 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;
По този начин вие сканирате само много малък брой записи в индекса при всяко запитване.
По-напреднал подход се състои в добавяне на новосъздадени идентификатори на автомобили в странична таблица чрез тригер. Тази странична маса се сканира от време на време, без да се заключва основната маса и без да се променя нейната структура. Просто TRUNCATE
тази странична маса след всяко гласуване.
И накрая, има опция за задействане на UDF, както е предложено от Panagiotis, но това изглежда е пресилено в повечето ситуации.