嗨,我不明白为什么我的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)
观察上面查询的Rows列我得到的结果如2024 1612 1934
为什么会发生这种情况?
答案 0 :(得分:1)
行数。一些存储引擎,如MyISAM,存储 准确计数。对于其他存储引擎,例如InnoDB,此值为 近似值,可能与实际值有差异多达40 到50%。在这种情况下,使用SELECT COUNT(*)来获得准确的结果 计数。
因此,这是InnoDB数据库的正常行为
答案 1 :(得分:1)
select count(*)...
现在为您提供实际的行数
select count(1)...
给出第一列不为空的行数
其他指标是基于数据库字典的指标,不会实时更新,但依赖于统计数据等。
有关COUNT
的信息,请参阅此处:
http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function_count
因此,如果您想要确切的行数 - 重复项和所有 - 现在(打开的交易可能除外,具体取决于isaolation级别),使用COUNT(*)
。< /强>