в случае COUNT(*)
всей таблицы MyISAM работает очень быстро, поскольку сохраняет внутреннее количество строк таблицы.
В случае COUNT(*) ... WHERE ...
оба MyISAM и InnoDB должны действительно считать соответствующие строки.Тогда скорость зависит главным образом от количества дискового ввода-вывода, необходимого для доступа к строкам.
MyISAM хранит внутренний кеш метаданных таблицы, например, количество строк.Это означает, что, как правило, COUNT(*)
не требует дополнительных затрат для хорошо структурированного запроса. InnoDB , однако, не имеет такого кэша.Для конкретного примера, скажем, мы пытаемся разбить запрос на страницы.Если у вас есть запрос SELECT * FROM users LIMIT 5,10
, скажем, запуск SELECT COUNT(*) FROM users LIMIT 5,10
по существу бесплатен с MyISAM , но занимает столько же времени, сколько и первый запрос с InnoDB . MySQL имеет опцию SQL_CALC_FOUND_ROWS
, которая сообщает InnoDB , чтобы вычислить количество строк при выполнении запроса, который затем можно получить, выполнив SELECT FOUND_ROWS()
.Это очень MySQL -специфично, но может быть необходимо в определенных ситуациях, особенно если вы используете InnoDB для других его функций (например, блокировки на уровне строк, хранимых процедур и т. Д.).