mysql 中查看一个表的记录条数

首先,声明一下。这里只是解释使用如下命令做表记录查询时得到的记录数和实际不符的现象。如果你有过这样困惑或者对此感兴趣,可以接着读下去,否则,移驾他处,免得浪费时间。

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&notify=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


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值