Подтвердить что ты не робот

Почему оцененные ряды очень сильно отличаются по результатам phpmyadmin?

Без каких-либо изменений в базе данных у меня очень разные строки в моих таблицах.

Что может вызвать это?

enter image description here

enter image description here

Server version: 5.1.63-cll
Engine: InnoDB
4b9b3361

Ответ 1

В отличие от таблиц 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.

Ответ 2

phpMyAdmin использует быстрый метод для подсчета строк, и этот метод возвращает только приблизительное значение в случае таблиц InnoDB.

См. $cfg['MaxExactCount'], чтобы изменить эти результаты, но это может серьезно повлиять на производительность.