首先,声明一下。这里只是解释使用如下命令做表记录查询时得到的记录数和实际不符的现象。如果你有过这样困惑或者对此感兴趣,可以接着读下去,否则,移驾他处,免得浪费时间。
mysql>>> select TABLE_NAME, PARTITION_NAME, TABLE_ROWS, AVG_ROW_LENGTH, DATA_LENGTH from INFORMATION_SCHEMA.PARTITIONS where TABLE_SCHEMA = 'LN_PABB2' and TABLE_NAME='T_BOUND' ;
好了,步入正题。
我先问,如何查看一个表中的记录条数?
你应该回答: 使用 select count(*) from [table_name]。
没错!
如果你曾经使用过 mysql partition 或者使用过如上的关于 “INFORMATION_SCHEMA” 的查询,对于如下的现象(使用count 和 INFORMATION_SCHEMA 得到的表的记录条数不一致)如何解释:
mysql> select TABLE_NAME, PARTITION_NAME, TABLE_ROWS, AVG_ROW_LENGTH, DATA_LENGTH from INFORMATION_SCHEMA.PARTITIONS where TABLE_SCHEMA = 'LN_PABB2';
+---------------------------+----------------+------------+----------------+-------------+
| TABLE_NAME | PARTITION_NAME | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH |
+---------------------------+----------------+------------+----------------+-------------+
| T_ADMINISTRATOR | NULL | 0 | 0 | 16384 |
| T_ADMINISTRATOR_LOGIN_LOG | NULL | 0 | 0 | 16384 |
| T_ADMINISTRATOR_SOURCE | NULL | 5 | 3276 | 16384 |
| T_AREA_PRIVILEGE | NULL | 0 | 0 | 16384 |
| T_BOUND | NULL | 8182737 | 95 | 781189120 |
| T_BOUND_DATA | NULL | 16365429 | 56 | 918552576 |
| T_BOUND_EVENT | NULL | 10144037 | 86 | 880820224 |
...
mysql> select count(id) from T_BOUND_EVENT ; +-----------+ | count(id) | +-----------+ | 10000001 | +-----------+ 1 row in set (10.05 sec) mysql> select count(id) from T_BOUND_EVENT ; +-----------+ | count(id) | +-----------+ | 10000001 | +-----------+ 1 row in set (10.05 sec) mysql> select count(id) from T_BOUND ; +-----------+ | count(id) | +-----------+ | 8182546 | +-----------+ 1 row in set (6.26 sec) mysql> select count(*) from T_BOUND ; +----------+ | count(*) | +----------+ | 8182546 | +----------+ 1 row in set (1.82 sec) mysql> select count(*) from T_BOUND ; +----------+ | count(*) | +----------+ | 8182546 | +----------+ 1 row in set (0.00 sec)
对于这问题,我曾经在一个mysql 的论坛上求助(http://groups.google.com/group/comp.databases.mysql/browse_thread/thread/61dbbd272b7e8472#),没有人回应。回来就把他作为mysql 的一个bug 提交。很快得到mysql的回复(http://bugs.mysql.com/bug.php?id=63869&thanks=2¬ify=3)。
原来事情是这样的:
Do you use InnoDB tables? If you do, this is not a bug. Please, read the manual, http://dev.mysql.com/doc/refman/5.5/en/partitions-table.html: "For partitioned InnoDB tables, the row count given in the TABLE_ROWS column is only an estimated value used in SQL optimization, and may not always be exact."
简答来说,对于使用了msyql partiton 分区的Innodb 数据表,TABLE_ROWS 的统计只是一个估算值,很有可能和实际的不符合。
关于INFORMATION_SCHEMA 的说明:
http://dev.mysql.com/doc/refman/5.5/en/partitions-table.html
关于 mysql partition 的说明:
http://dev.mysql.com/doc/refman/5.5/en/partitioning.html