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

时间:2013-04-03 19:44:59

标签: 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)

这里我也是这样做的,按'向上'并再次运行最后一个命令,但输出是chaning。这里发生了什么?没有什么可以使用这个数据库,因为它是我本地笔记本电脑上的副本,用于我自己的修修补补。为什么表{1}}的表行数会发生变化?

tblTraceOutput

刷新页面时我在phpMyAdmin中看到了这种行为,所以我想在CLI上查看自己,正如您所看到的,它确实在变化!

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)

4 个答案:

答案 0 :(得分:21)

假设您正在使用InnoDB,因为这是5.5.x according to the MySQL INFORMATION_SCHEMA TABLES documentation中的默认值。

这个说明:

  

如果表位于,则TABLE_ROWS列为NULL   INFORMATION_SCHEMA数据库。

     

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

答案 1 :(得分:7)

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

答案 2 :(得分:5)

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

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

Source

答案 3 :(得分:1)

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