MySQL дает переменный счетчик строк при запросе схемы?

Здесь я снова и снова нажимаю и запускаю ту же самую команду на своем dev DB на своем ноутбуке;

mysql> select count(*) from tblTraceOutput;
+----------+
| count(*) |
+----------+
|   300175 |
+----------+
1 row in set (0.42 sec)

mysql> select count(*) from tblTraceOutput;
+----------+
| count(*) |
+----------+
|   300175 |
+----------+
1 row in set (0.35 sec)

mysql> select count(*) from tblTraceOutput;
+----------+
| count(*) |
+----------+
|   300175 |
+----------+
1 row in set (0.45 sec)

Здесь я делаю то же самое, нажав "вверх" и снова запустив последнюю команду, но выход - это чередование. Что здесь происходит? Ничто не использует эту базу данных, поскольку это копия на моем локальном ноутбуке для моего собственного возиться. Почему изменяется таблица строк таблицы для таблицы tblTraceOutput?

mysql> SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'smoketrace';
+----------------+------------+
| table_name     | table_rows |
+----------------+------------+
| tblCategories  |          9 |
| tblResults     |      32463 |
| tblRoutes      |        300 |
| tblSettings    |          2 |
| tblTraceOutput |     303463 |
| tblTraces      |         12 |
+----------------+------------+
6 rows in set (0.01 sec)

mysql> SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'smoketrace';
+----------------+------------+
| table_name     | table_rows |
+----------------+------------+
| tblCategories  |          9 |
| tblResults     |      32948 |
| tblRoutes      |        246 |
| tblSettings    |          2 |
| tblTraceOutput |     297319 |
| tblTraces      |         12 |
+----------------+------------+
6 rows in set (0.00 sec)

mysql> SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'smoketrace';
+----------------+------------+
| table_name     | table_rows |
+----------------+------------+
| tblCategories  |          9 |
| tblResults     |      32948 |
| tblRoutes      |        451 |
| tblSettings    |          2 |
| tblTraceOutput |     302127 |
| tblTraces      |         12 |
+----------------+------------+
6 rows in set (0.02 sec)

Я видел это поведение в phpMyAdmin при обновлении страницы, поэтому я хотел проверить себя на CLI, и, как вы можете видеть, это действительно меняется!

mysql --version
./bin/mysql  Ver 14.14 Distrib 5.5.8, for Linux (i686) using  EditLine wrapper
free -m
             total       used       free     shared    buffers     cached
Mem:          1880       1830         49          0         51        600
-/+ buffers/cache:       1179        701
Swap:         1027          0       1026
uname -a
Linux laptop 3.4.11 #1 SMP Sun Sep 23 15:03:21 BST 2012 i686 i686 i386 GNU/Linux

Ответы

Ответ 1

Предполагая, что вы используете InnoDB, поскольку это по умолчанию используется в 5.5.x в соответствии с документацией MySQL INFORMATION_SCHEMA TABLES.

И это примечание:

Столбец TABLE_ROWS имеет значение NULL, если таблица находится в База данных INFORMATION_SCHEMA.

Для таблиц InnoDB количество строк является приблизительной оценкой, используемой в SQL оптимизация. (Это также верно, если таблица InnoDB разделена.)

Ответ 2

Это не ошибка. Значение, указанное в столбце table_rows information_schema.tables, не гарантируется точно, и мы не ожидаем его.

Ответ 3

Если вы используете InnoDB в качестве механизма хранения, количество строк является оценкой.

For InnoDB tables, the row count is only a rough estimate used in SQL optimization. 

Источник

Ответ 4

Кажется, вы используете таблицу InnoDB. Они содержат только приблизительную оценку номеров строк в таблице состояния, чтобы помочь оптимизатору MySQL иметь основу для выбора плана запроса. Для точного подсчета строк вы должны держать отдельный счетчик, если это необходимо часто (так как select count (*) далеко не эффективен).