count(1)方法
count(a)和count(*)的区别
count(a)表示统计a列,不统计null值。 count(*)无论是否包含null值,都会统计。
MyISAM引擎和InnoDB引擎count(*)的区别
对于MyISAM引擎,如果没有where子句,也没有检索其它列,那么count(*)将会非常快,因为MyISAM引擎会把表的总行数存在磁盘上。
InnoDB引擎不会保留表中行数,因为并发事务可能读取到不同的行数,执行count(*)都是临时去遍历普通索引树,计算表数据总量,会比MyISAM引擎慢很多。
MySQL5.7.18前后count(*)的区别
MySQL5.7.18前,InnoDB通过扫描聚簇索引来处理count()语句。 MySQL5.7.18开始,通过遍历最小的可用二级索引来处理count()语句。如果不存在二级索引,则扫描聚簇索引。 新版本为什么使用二级索引来处理count(*)语句?
原因是InnoDB二级索引树的叶子节点存放的是主键,而主键索引树的叶子节点存放的是整行数据,二级索引树比主键索引树小。优化器基于成本考虑,优先选择二级索引。count(主键)没有count(*)快。
count(1)和count(*)区别
- count(*)无论是否包含null值,都会统计。
- count(1)的1是恒真表达式,因此也会统计所有结果。
- count(1)和和count(*)统计结果没有差别。