MySQL не «оптимизирует» запросы count (*) в InnoDB из-за управления версиями. Каждый элемент в индексе должен быть повторен и проверен, чтобы убедиться, что версия верна для отображения (например, не открытая фиксация). Так как любые ваши данные могут быть изменены по всей базе данных, выборки на расстоянии и кэширование не будут работать. Тем не менее, вы можете получить с помощью триггеров. Есть два метода этого безумия.
Этот первый метод рискует замедлить ваши транзакции, поскольку ни одна из них не может действительно работать параллельно: используйте триггеры после вставки и после удаления для увеличения / уменьшения таблицы счетчиков. Второй прием: используйте эти триггеры вставки / удаления, чтобы вызвать хранимую процедуру, которая передается во внешнюю программу, которая аналогичным образом корректирует значения вверх и вниз или воздействует на нетранзакционную таблицу. Помните, что в случае отката это приведет к неточным числам.
Если вам не нужны точные цифры, проверьте этот запрос:
select table_rows from information_schema.tables
where table_name = 'foo';
Пример разницы: count (*): 1876668, table_rows: 1899004. Значение table_rows является оценочным, и вы будете получать разные числа каждый раз, даже если ваша база данных не изменяется.
Для моего собственного любопытства: вам нужны точные цифры, которые обновляются каждую секунду? Если так, почему?