不同的 MySQL 引擎中,count(*) 有不同的实现方式。
1. MyISAM 引擎:把一个表的总行数存在磁盘上,执行 count(*) 的时候直接返回这个数,效率很高;
2. InnoDB 引擎:把数据一行一行地从引擎里面读出来,然后累积计数。
所以结论是:按照效率排序的话,count(字段)<count(主键 id)<count(1)≈count(*)。
小结:
1. MyISAM 表虽然 count(*) 很快,但是不支持事务;
2. show table status 命令虽然返回很快,但是不准确;
3. InnoDB 表直接 count(*) 会遍历全表,虽然结果准确,但会导致性能问题。
自己计数方式:
1. 用缓存系统保存计数:缓存可能失效,数据可能不准确。
2. 在数据库保存计数:
(极客时间,MySQL实战45讲,第14讲,不太明白 -0-)