查询模式时,MySQL给出波动的行数?

wmvff8tz  于 2022-11-28  发布在  Mysql
关注(0)|答案(5)|浏览(139)

在这里,我在笔记本电脑的devDB上一遍又一遍地按下并运行同一命令;

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)

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

wmtdaxz31#

假设您使用的是InnoDB,因为这是5.5.x according to the MySQL INFORMATION_SCHEMA TABLES documentation中的默认设置。
还有这张纸条:
如果表位于INFORMATION_SCHEMA数据库中,则TABLE_ROWS列为NULL.
对于InnoDB表,行数只是SQL优化中使用的粗略估计。(如果InnoDB表已分区,也是如此。)

cnwbcb6i

cnwbcb6i2#

这不是一个bug。在information_schema.tablestable_rows列中报告的值不保证是准确的,我们也不期望它是准确的。

iecba09b

iecba09b3#

如果您使用InnoDB作为存储引擎,那么行数只是一个估计值。

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

Source

z31licg0

z31licg04#

看起来您使用的是InnoDB表。它们只保存状态表中行数的粗略估计,目的是帮助MySQL优化器为查询计划选择提供依据。对于精确的行数,如果经常需要,您应该保留一个单独的计数器(因为select count(*)效率很低)。

dddzy1tm

dddzy1tm5#

ANALYZE TABLE tblTraceOutput;

这将告诉您的DB有一个清晰的外观为您的表。它为我工作。

相关问题