Mysql——一文让你搞懂count(*)和count(1)

1. COUNT()函数作用

COUNT() 是 MySQL 中用于统计记录数量的聚合函数,它是 MySQL 中通用的聚合统计函数,核心作用是统计满足条件的行数。

2.原理

  • COUNT(*)作为 SQL 标准定义的行数统计语法,它不针对任何字段,核心是直接判断行是否存在。执行时,优化器会优先选择最精简的索引(主键、二级索引),仅遍历索引记录判断行的存在性,不读取表中任何字段值,每发现一行符合条件的记录,计数器就加 1,全程只关注 行是否存在,是最直接的行数统计逻辑。
  • COUNT(1)本质是对虚拟常量列的非 NULL 计数 —— 执行时不会读取表的实际字段,而是为每一行构造一个值为 1 的虚拟列,由于 1 是常量永远非 NULL,因此每遍历到一行符合条件的记录,就会因该虚拟列非 NULL 而让计数器加 1,最终等价于统计行数,但逻辑上是通过常量列计数间接实现,而非直接判断行的存在性。

MySQL 5.6版本之后的优化器会识别到 count(1) 的虚拟列 1 永远非 NULL,其计数逻辑等价于 count(*),因此会将 count(1) 等价转换为 count(*) 后执行,最终二者的索引选择、扫描行数、IO 消耗完全一致,仅底层计数的逻辑表述不同。

3.实践

3.1 COUNT(*)实践

进入实操环节加深一下记忆

表数据如下:

  • 当没有 WHERE和 HAVING时,COUNT(*) 用于统计整张表的总行数(包括NULL值),或每个分组的总行数(有 GROUP BY 时)。

  • 有 GROUP BY ,无 WHERE/HAVING → 统计每个分组的行数

  • 有WHERE时,先进行符合条件的过滤,再对行数进行统计

  • 有HAVING时,先通过 COUNT(*) 是先统计、后过滤分组的逻辑。


COUNT(1) 在WHERE/HAVING以及分组的情况下使用的效果基本等同于COUNT(*)。底层优化器会将 count(1) 等价转换为 count(*) 再优化,最终执行计划完全一致。

4.总结

写法是否忽略NULL统计逻辑性能
count(*)统计总行数最优(优化器优先选)
count(1)统计常量 1 的非 NULL 行数等价于 count (*)
count (字段名)统计该字段非 NULL 的行数更低(需判断 NULL)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值