0

嗨,我不明白为什么我的 MYSQL 行为异常。

在这里我想知道表site_details中存在的记录数为了得到这个我已经执行 select count(*) from site_details; 了我得到的结果是

+----------+
| count(*) |
+----------+
|     2024 |
+----------+

然后再次验证我已经执行 mysql> SHOW TABLE STATUS FROM msp LIKE 'site_details'\G 了我得到的结果

 *************************** 1. row ***************************
           Name: site_details
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 1612
 Avg_row_length: 71
    Data_length: 114688
Max_data_length: 0
   Index_length: 81920
      Data_free: 7340032
 Auto_increment: NULL
    Create_time: 2012-10-01 08:05:09
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment: 
1 row in set (0.00 sec)

观察两个查询的行数之间的计数差异

然后在不修改我的表的情况下,我再次执行了相同的查询 mysql> SHOW TABLE STATUS FROM msp LIKE 'site_details'\G ,奇怪的是我得到了类似的结果

 *************************** 1. row ***************************
           Name: site_details
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 1934
 Avg_row_length: 59
    Data_length: 114688
Max_data_length: 0
   Index_length: 81920
      Data_free: 7340032
 Auto_increment: NULL
    Create_time: 2012-10-01 08:05:09
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment: 
1 row in set (0.00 sec)

观察上述查询的行列,我得到了类似 2024 1612 1934 的结果

为什么会这样??

4

2 回答 2

1

来自MySQL 文档

行数。一些存储引擎,例如 MyISAM,存储确切的计数。对于其他存储引擎,例如 InnoDB,这个值是一个近似值,可能与实际值相差 40% 到 50%。在这种情况下,请使用 SELECT COUNT(*) 获得准确的计数。

所以,这是 InnoDB 数据库的正常行为

于 2012-10-19T13:47:23.607 回答
1
select count(*)...

现在给你实际的行数

select count(1)...

给出第一列不为空的行数

其他的是基于数据库字典的指标,它们不是实时更新的,而是依赖于统计数据等。

有关以下信息,请参见此处COUNT

http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function_count

因此,如果您现在想要确切的行数 - 重复的和所有的(打开的事务可能除外,具体取决于隔离级别),请使用COUNT(*).

于 2012-10-19T13:48:15.480 回答