Без каких-либо изменений в базе данных у меня очень разные строки в моих таблицах.
Что может вызвать это?
Server version: 5.1.63-cll
Engine: InnoDB
Без каких-либо изменений в базе данных у меня очень разные строки в моих таблицах.
Что может вызвать это?
Server version: 5.1.63-cll
Engine: InnoDB
В отличие от таблиц MyISAM, таблицы InnoDB не отслеживают, сколько строк содержит таблица.
Из-за этого единственный способ узнать точное количество строк в таблице InnoDB - проверить каждую строку в таблице и скопировать счет. Поэтому на больших таблицах InnoDB выполнение запроса SELECT COUNT(*) FROM innodb_table
может быть очень медленным, потому что оно выполняет полное сканирование таблицы, чтобы получить количество строк.
phpMyAdmin использует запрос типа SHOW TABLE STATUS
, чтобы получить подсчитанный подсчет количества строк в таблице от движка (InnoDB). Поскольку это просто оценка, она меняется каждый раз, когда вы ее называете, иногда вариации могут быть довольно большими, а иногда они близки.
Вот информативное сообщение в блоге о COUNT (*) для таблиц InnoDB от Percona.
Страница руководства MySQL для SHOW TABLE STATUS утверждает:
Число строк. Некоторые устройства хранения данных, такие как MyISAM, сохраняют точное количество. Для других систем хранения данных, таких как InnoDB, это значение равно приближение и может варьироваться от фактического значения на целых 40 до 50%. В таких случаях используйте SELECT COUNT (*) для получения точной кол.
Страница на ограничения InnoDB идет более подробно:
SHOW TABLE STATUS не дает точной статистики по таблицам InnoDB, за исключением физического размера, зарезервированного для таблицы. Счетчик строк является приблизительной оценкой, используемой при оптимизации SQL.
InnoDB не сохраняет внутренний счет строк в таблице, потому что параллельные транзакции могут "видеть" различное количество строк на в то же время. Чтобы обработать оператор
SELECT COUNT(*) FROM t
, сканирование InnoDB индекс таблицы, который занимает некоторое время, если индекс не является полностью в буферном пуле. Если таблица не меняется часто, использование кеша запросов MySQL является хорошим решением. Чтобы получить быстрый счет, вы должны использовать таблицу счетчиков, которую вы создаете, и приложение обновляет его в соответствии с вставками и удаляет его. Если достаточно приблизительного количества строк, можно использоватьSHOW TABLE STATUS
. См. Раздел 14.3.14.1, Советы по настройке производительности InnoDB.
phpMyAdmin использует быстрый метод для подсчета строк, и этот метод возвращает только приблизительное значение в случае таблиц InnoDB.
См. $cfg['MaxExactCount']
, чтобы изменить эти результаты, но это может серьезно повлиять на производительность.