Count(*) 实现原理 数据量大如何count(*)?
1 为啥 COUNT(*)慢?
因为MVCC多版本并发控制的原因,就算在同一时间内 count(*)的数量也不一定相同。
- MyISAM 表虽然 count(*) 很快,但是不支持事务;
- show table status 命令虽然返回很快,但是不准确;
- InnoDB 表直接 count(*) 会遍历全表,虽然结果准确,但会导致性能问题。
2 解决方案 优缺点
1 缓存保存计数
优点:解决count 过慢问题
缺点:会有分布式事务问题
2 数据库保存计数
优点:1 解决count过慢问题
2 没有分布式事务问题
所以结论是:按照效率排序的话,count(字段)<count(主键 id)<count(1)≈count(*),所以我建议你,尽量使用 count(*)。
——————————-chenchen