MySQL-09丨count(1)方法

Posted by jiefang on October 28, 2019

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(*)统计结果没有差别。