MySQL中count(*)、count(1)和count(字段名)有什么区别

MySQL中COUNT(*)COUNT(1)COUNT(字段名)的区别:

计数类型 描述 是否计算NULL值 性能考虑
COUNT(*) 计算包括所有列的行数 是,不区分列值是否为NULL 通常最优,因为不需要检查特定列的值
COUNT(1) 功能上与COUNT(*)等价,计算行数 是,1是一个常量,永远不为NULL COUNT(*)性能相同,因为执行计划通常相同
COUNT(字段名) 计算指定列中非NULL值的行数 否,只计算非NULL值的行数 可能比COUNT(*)COUNT(1)慢,特别是当检查的字段包含许多NULL值时

在大多数情况下,COUNT(*)是首选,因为它既符合SQL标准,又在性能上表现良好。

在MySQL等关系数据库管理系统中,COUNT(*)COUNT(1) 在功能上是等价的,它们之间的区别并不明显,主要体现在以下几个方面:

COUNT(*)、COUNT(1)有明显区别吗

1. 功能等价性

  • COUNT(*):计算查询结果集中的所有行数,包括所有列,不会忽略任何行,即使某些列包含NULL值。
  • COUNT(1):将1作为一个非空的常量值,对每一行进行计数。由于1永远不为NULL,因此它实际上与COUNT(*)一样计算所有行。

在现代数据库系统中,COUNT(*)COUNT(1)在执行计划中的表现通常相同,查询效率基本没有区别。

2. 语义清晰性

  • COUNT(*):语义明确,清楚地表明了计数所有行的意图,因此更受青睐。对于阅读代码的人来说,它更直观。
  • COUNT(1):虽然功能上等价于COUNT(*),但某些开发人员可能出于个人或历史原因更喜欢它的外观。然而,从语义清晰性的角度来看,COUNT(*)更胜一筹。

3. 性能差异(历史与现代数据库系统的对比)

  • 在历史上,某些旧版的数据库系统在处理COUNT(*)时,可能会去解析整行数据,而COUNT(1)可以直接统计行数,因此会有一些微小的性能差异。
  • 然而,在现代数据库系统中(如MySQL、PostgreSQL、SQL Server等),COUNT(*)COUNT(1)在性能方面处理相似。这些系统的优化器理解这两个查询本质上是在要求相同的内容:行计数。因此,性能差异可以忽略不计。

4. 使用建议

  • 在编写SQL查询时,应优先考虑代码的可读性和可维护性。COUNT(*)因其清晰和可读性通常更受推荐。
  • 除非基于对数据库优化器的深入理解或个人偏好(且这种偏好在现代数据库系统中通常不会带来性能上的显著优势),否则应使用COUNT(*)来计数行。

综上,COUNT(*)COUNT(1)在功能上是等价的,并且在现代数据库系统中性能差异可以忽略不计。

相关推荐
星辰离彬16 分钟前
Java 与 MySQL 性能优化:MySQL连接池参数优化与性能提升
java·服务器·数据库·后端·mysql·性能优化
小苹果13572 小时前
阿里云mysql数据丢失,如何通过服务器备份在其他服务器上恢复数据,并获取mysql丢失数据,完成mysql数据恢复
服务器·mysql·阿里云
张璐月3 小时前
mysql join语句、全表扫描 执行优化与访问冷数据对内存命中率的影响
数据库·mysql
ruan1145143 小时前
MySQL4种隔离级别
java·开发语言·mysql
全干engineer4 小时前
ClickHouse 入门详解:它到底是什么、优缺点、和主流数据库对比、适合哪些场景?
数据库·clickhouse
Hellyc6 小时前
基于模板设计模式开发优惠券推送功能以及对过期优惠卷进行定时清理
java·数据库·设计模式·rocketmq
lifallen6 小时前
Paimon LSM Tree Compaction 策略
java·大数据·数据结构·数据库·算法·lsm-tree
慕木兮人可10 小时前
Docker部署MySQL镜像
spring boot·后端·mysql·docker·ecs服务器
{⌐■_■}10 小时前
【Kafka】登录日志处理的三次阶梯式优化实践:从同步写入到Kafka多分区批处理
数据库·分布式·mysql·kafka·go