Se sua mesa for MyISAM, eu seguiria sua ideia inicial. Obter a contagem de linhas de uma tabela MyISAM é instantâneo. Leva apenas a leitura de um único valor, pois o MyISAM mantém a contagem de linhas o tempo todo.
Com o InnoDB, essa abordagem ainda pode ser aceitável. Assumindo
car_table.id
é a chave primária, SELECT COUNT(id) FROM car_table
requer apenas uma verificação de índice, que é muito rápida. Você pode melhorar essa ideia adicionando outra coluna booleana indexada à sua tabela:ALTER car_table ADD COLUMN checked BOOLEAN NOT NULL DEFAULT 0, ADD INDEX (checked);
O valor padrão garante que novos carros sejam inseridos com esse sinalizador definido como 0 sem modificar a instrução de inserção. Então:
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;
Dessa forma, você verifica apenas um número muito pequeno de entradas de índice em cada pesquisa.
Uma abordagem mais avançada consiste em adicionar IDs de carros recém-criados em uma tabela lateral, por meio de um gatilho. Esta mesa lateral é escaneada de vez em quando, sem travar a mesa principal e sem alterar sua estrutura. Simplesmente
TRUNCATE
esta mesa lateral após cada votação. Finalmente, há a opção de acionar uma UDF, como sugerido por Panagiotis, mas isso parece ser um exagero na maioria das situações.