Почему моя таблица InnoDB имеет странное значение для количества записей?

Ниже приведено количество строк для 2 таблиц в моей базе данных mysql
1 — это myisam, другая innodb,

может кто-нибудь сказать мне, почему у innodb есть ~ перед номером?

Эти цифры пришли из phpmyadmin

10,308      MyISAM  
~118,011    InnoDB

person JasonDavis    schedule 09.08.2009    source источник


Ответы (2)


phpMyAdmin использует SHOW TABLE STATUS для получения информации о ваших таблицах.

Из документации:

Ряды

Количество рядов. Некоторые механизмы хранения, такие как MyISAM, хранят точное количество. Для других механизмов хранения, таких как InnoDB, это значение является приблизительным и может отличаться от фактического значения на 40–50 %. В таких случаях используйте SELECT COUNT(*) для получения точного подсчета.

Это связано с тем, что InnoDB является механизмом хранения, совместимым с ACID. InnoDB реализует MVCC с использованием уровня строки блокировка. Короче говоря, может быть несколько копий данной строки в данный момент времени. Я предлагаю прочитать эту статью: Understanding InnoDB MVCC.

person hobodave    schedule 09.08.2009

Поскольку InnoDB является механизмом хранения транзакций, точное количество зависит от интерпретации. Например, некоторые строки могут существовать в хранилище, но транзакция, создавшая эти строки, еще не зафиксирована. Таким образом, строки не должны быть включены в подсчет.

Еще больше сбивает с толку то, что ваша транзакция может иметь уровень изоляции REPEATABLE READ, что означает, что видны только те строки, которые были зафиксированы до начала транзакции. Некоторые строки могут быть зафиксированы, но позже начала вашей повторяемой транзакции чтения. Таким образом, эти строки также не должны быть включены в подсчет. Но те же строки включаются в подсчет, выполненный другой транзакцией, которая была запущена позже или на уровне изоляции READ COMMITTED.

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

person Bill Karwin    schedule 09.08.2009