1、count(*)、count(1) 和 count(单个字段) 的区别

SQL 中三种 COUNT 函数的区别

1. count(*):统计所有行数

  • 统计逻辑:统计满足条件的所有行数,不关心具体的列值。
  • NULL值处理 :不忽略 NULL 值。即使某行的所有字段都是 NULL,也会被统计。
  • 执行性能:⭐⭐⭐⭐⭐ (最优)。现代数据库(如MySQL InnoDB)对其有专门优化,通常选择最小的二级索引进行扫描,无需读取完整行数据。

2. count(1):统计所有行数

  • 统计逻辑 :传入常量 1,为每一行分配固定值 1 并计数。效果等同于统计总行数。
  • NULL值处理 :不忽略 NULL 值,结果与 count(*) 完全一致。
  • 执行性能 :⭐⭐⭐⭐⭐ (与 count(*) 一致)。在现代数据库优化器中,count(1) 会被自动转换为与 count(*) 相同的执行逻辑,两者性能几乎没有差别。

3. count(单个字段):统计该字段非NULL的行数

  • 统计逻辑:专门统计指定字段有值的行数。
  • NULL值处理 :会忽略 NULL 值。如果该字段值为 NULL,该行会被过滤掉,不参与计数。
  • 执行性能 :⭐⭐ (依赖索引,最差)。
    • 有索引:扫描该二级索引,并额外判断是否为 NULL。
    • 无索引:只能进行全表扫描,读取每一行该字段的值进行判断,性能最差。

核心对比总结

对比维度 count(*) count(1) count(单个字段)
统计结果 所有行数(含NULL) 所有行数(含NULL) 仅该字段非NULL的行数
执行效率 ⭐⭐⭐⭐⭐ (最优) ⭐⭐⭐⭐⭐ (与*一致) ⭐⭐ (依赖索引,最差)
语义 统计行数 统计行数 统计某列的非空数据量

最佳实践建议

  1. 统计表的总行数 ,请无脑使用 count(*)。它是 SQL 标准语法,语义明确且性能最优。
  2. 只有明确需要统计某个特定字段非空值的数量 时,才使用 count(单个字段)。注意:如果该字段允许为 NULL,统计结果可能少于总行数。
  3. 网上流传的"count(1) 比 count(*) 快"的说法在现代数据库中已不再成立,两者性能基本一致。
相关推荐
锦衣夜行?2 小时前
Oracle 数据库安装失败清理残留步骤
数据库·oracle
时间售卖铺2 小时前
MySQL 表的约束
运维·数据库·mysql·云原生
一条泥憨鱼2 小时前
【Redis | 黑马点评】基于Redis的消息队列 | stream消息队列 源码解读
java·数据库·redis·缓存·lua
CodeGL2 小时前
9、Python基础之IO编程
开发语言·数据库·python
每天一道题2 小时前
Redis 缓存为什么会出问题?穿透、击穿、雪崩与缓存一致性
数据库·redis·缓存
tongyiixiaohuang2 小时前
物料成本核算单同步返回信息策略实战教程:从金蝶云星空回写 MySQL 的闭环设计
数据库·mysql
星云低代码开发平台2 小时前
AI 工作台记录删除与业务审计留存:三层数据边界设计
数据库·人工智能·架构
code_slave(码畜)3 小时前
微服务架构落地:分库分表实战(下) —— 分布式主键、跨分片查询与分页聚合防坑
数据库·spring boot·分布式·spring cloud·微服务·架构·分库分表
dishugj3 小时前
https://blog.csdn.net/dishugj/article/details/162068579
数据库·系统架构