当前位置: 代码迷 >> 综合 >> count(1)、count(*)、count(字段)的区别
  详细解决方案

count(1)、count(*)、count(字段)的区别

热度:48   发布时间:2024-02-07 19:13:09.0

MyISAM不支持事务,MyISAM中的锁是表级锁;而InnoDB支持事务,并且支持行级锁。

count(1):InnoDB 遍历全表,但是不取值,server 层对返回的每一行数据新增一个 1,然后进行判断累加。包括NULL值行。

count(*):

  • MyISAM把表的总行数单独记录下来,若没有where groupby,直接返回行数。包括NULL值行。
  • InnoDB不能使用这种缓存操作,因为支持事务,大部分操作都是行级锁,行可能被并行修改,那么缓存记录不准确。

    但是,InnoDB还是针对COUNT(*)语句做了些优化的。InnoDB中索引分为聚簇索引(主键索引)和非聚簇索引(非主键索引),聚簇索引的叶子节点中保存的是整行记录,而非聚簇索引的叶子节点中保存的是该行记录的主键的值。MySQL会优先选择最小的非聚簇索引来扫表。

  •  

    对于count(1)和count(*),MySQL的优化是完全一样的,根本不存在谁更快!但依旧建议使用count(*)。

count(字段):判断字段是否为NULL,在过滤统计。不包含NULL值行。

 

 

  相关解决方案