Почему моя таблица InnoDB имеет странное значение для количества записей? - PullRequest
4 голосов
/ 09 августа 2009

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

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

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

10,308      MyISAM  
~118,011    InnoDB

Ответы [ 2 ]

11 голосов
/ 09 августа 2009

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

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

Ряды

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

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

4 голосов
/ 09 августа 2009

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

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

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

...