[英]mysql analyze table results in odd behavior
我注意到运行时得到的表总计:
SELECT TABLE_NAME, TABLE_ROWS FROM `information_schema`.`tables` WHERE `table_schema` = 'my_database';
导致总数不正确。 我还读到这样做:
analyze table 'my_table';
将正确更新信息。 但似乎并非如此。 因此,要设置基准:
mysql> select count(*) from my_table;
+----------+
| count(*) |
+----------+
| 61782 |
+----------+
1 row in set (0.01 sec)
接下来,统计数据显示:
mysql> SELECT TABLE_NAME, TABLE_ROWS FROM `information_schema`.`tables` WHERE `table_schema` = 'my_database' AND TABLE_NAME = 'my_table';
+--------------------+------------+
| TABLE_NAME | TABLE_ROWS |
+--------------------+------------+
| my_table | 58378 |
+--------------------+------------+
1 row in set (0.00 sec)
显然,那是不对的,所以我进行分析并再次检查:
mysql> analyze table my_table;
+------------------------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+------------------------------+---------+----------+----------+
| my_database.my_table | analyze | status | OK |
+------------------------------+---------+----------+----------+
1 row in set (0.02 sec)
mysql> SELECT TABLE_NAME, TABLE_ROWS FROM `information_schema`.`tables` WHERE `table_schema` = 'my_database' AND TABLE_NAME = 'my_table';
+--------------------+------------+
| TABLE_NAME | TABLE_ROWS |
+--------------------+------------+
| my_table | 56439 |
+--------------------+------------+
1 row in set (0.00 sec)
好的,它改变了,但是仍然是错误的。 所以我做了几次:
mysql> analyze table my_table;
+------------------------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+------------------------------+---------+----------+----------+
| my_database.my_table | analyze | status | OK |
+------------------------------+---------+----------+----------+
1 row in set (0.02 sec)
mysql> SELECT TABLE_NAME, TABLE_ROWS FROM `information_schema`.`tables` WHERE `table_schema` = 'my_database' AND TABLE_NAME = 'my_table';
+--------------------+------------+
| TABLE_NAME | TABLE_ROWS |
+--------------------+------------+
| my_table | 58766 |
+--------------------+------------+
1 row in set (0.00 sec)
mysql> analyze table my_table;
+------------------------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+------------------------------+---------+----------+----------+
| my_database.my_table | analyze | status | OK |
+------------------------------+---------+----------+----------+
1 row in set (0.02 sec)
mysql> SELECT TABLE_NAME, TABLE_ROWS FROM `information_schema`.`tables` WHERE `table_schema` = 'my_database' AND TABLE_NAME = 'my_table';
+--------------------+------------+
| TABLE_NAME | TABLE_ROWS |
+--------------------+------------+
| my_table | 65749 |
+--------------------+------------+
1 row in set (0.00 sec)
mysql> analyze table my_table;
+------------------------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+------------------------------+---------+----------+----------+
| my_database.my_table | analyze | status | OK |
+------------------------------+---------+----------+----------+
1 row in set (0.02 sec)
mysql> SELECT TABLE_NAME, TABLE_ROWS FROM `information_schema`.`tables` WHERE `table_schema` = 'my_database' AND TABLE_NAME = 'my_table';
+--------------------+------------+
| TABLE_NAME | TABLE_ROWS |
+--------------------+------------+
| my_table | 61870 |
+--------------------+------------+
1 row in set (0.00 sec)
如您所见,我从来没有得到相同的数字,而且它们都不是实际的行数。 我的问题是:这是否表明我的数据库有问题(在所有表上都存在问题),或者这仅仅是MySQL中的错误?
我的环境的详细信息:
服务器版本:5.6.43 MySQL Community Server(GPL)所有表均为INNODB,字符集为utf8
对于InnoDB, table_rows
统计信息是估计值 ,而不是精确的计数。 该值不能保证是确切的行数。
不,这不是MySQL中的错误。 InnoDB统计信息没有错。 行为记录在《 MySQL参考手册》中。
参考文献:
https://dev.mysql.com/doc/refman/5.6/zh-CN/index-statistics.html
https://dev.mysql.com/doc/refman/5.6/zh-CN/innodb-persistent-stats.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.