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 (*) далеко не эффективен).