22

在这里,我在笔记本电脑上的开发数据库上一遍又一遍地按下并运行相同的命令;

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)

在这里我也在做同样的事情,按“向上”并再次运行最后一个命令,但输出正在改变。这里发生了什么?什么都没有使用这个数据库,因为它是我本地笔记本电脑上的一个副本,供我自己修修补补。为什么 table 的 table 行数会发生变化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
4

4 回答 4

26

假设您使用的是 InnoDB,因为根据 MySQL INFORMATION_SCHEMA TABLES 文档,这是 5.5.x 中的默认设置。

还有这个注释:

如果表在 INFORMATION_SCHEMA 数据库中,则 TABLE_ROWS 列为 NULL。

对于 InnoDB 表,行数只是 SQL 优化中使用的粗略估计。(如果 InnoDB 表是分区的,这也是如此。)

于 2013-04-03T19:50:31.737 回答
8

这不是一个错误。table_rows列中报告的值information_schema.tables不能保证准确,我们也不期望准确。

于 2013-04-03T19:50:36.560 回答
5

如果您使用 InnoDB 作为存储引擎,则行数是估计值。

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

来源

于 2013-04-03T19:48:59.753 回答
1

看来您正在使用 InnoDB 表。它们仅对状态表中的行数进行非常粗略的估计,以帮助 MySQL 优化器为查询计划选择提供依据。对于准确的行数,如果经常需要,您应该保留一个单独的计数器(因为 select count(*) 远非有效)。

于 2013-04-03T19:49:53.610 回答