1. 程式人生 > >mysql 中檢視一個表的記錄條數

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)

原來事情是這樣的: 

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 的說明:

關於 mysql partition 的說明: