Jeśli Twoim stołem jest MyISAM, trzymałbym się Twojego początkowego pomysłu. Uzyskanie liczby wierszy z tabeli MyISAM jest natychmiastowe. Odczytuje tylko jedną wartość, ponieważ MyISAM przez cały czas utrzymuje licznik wierszy.
W przypadku InnoDB takie podejście może być nadal akceptowalne. Zakładając, że car_table.id
to klucz podstawowy, SELECT COUNT(id) FROM car_table
wymaga jedynie skanowania indeksu, które jest bardzo szybkie. Możesz ulepszyć ten pomysł, dodając do tabeli kolejną zindeksowaną kolumnę logiczną:
ALTER car_table ADD COLUMN checked BOOLEAN NOT NULL DEFAULT 0, ADD INDEX (checked);
Wartość domyślna zapewnia, że nowe samochody będą wstawiane z tą flagą ustawioną na 0 bez modyfikowania instrukcji wstawiania. Następnie:
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;
W ten sposób skanujesz tylko bardzo małą liczbę wpisów indeksu podczas każdego odpytywania.
Bardziej zaawansowane podejście polega na dodaniu nowo utworzonych identyfikatorów samochodów do bocznej tabeli za pomocą wyzwalacza. Ten stolik boczny jest co jakiś czas skanowany, bez blokowania głównego stolika i bez zmiany jego struktury. Po prostu TRUNCATE
ten stolik po każdym odpytywaniu.
Wreszcie istnieje możliwość uruchomienia UDF, jak sugeruje Panagiotis, ale w większości sytuacji wydaje się to przesadą.