当前位置: 首页 > article >正文

MySQL 中 COUNT(1)、COUNT(*) 和 COUNT(列名) 的区别

MySQL 中 COUNT(1)COUNT(*)COUNT(列名) 的区别

在MySQL中,COUNT() 函数用于统计查询结果集中的行数。根据传入参数的不同,其行为和性能也会有所不同。本文将详细介绍 COUNT(1)COUNT(*)COUNT(列名) 之间的主要区别,并提供一些性能方面的建议。

1. COUNT(*)
  • 定义COUNT(*) 统计查询结果集中的所有行数,包括所有列,不会忽略任何行,即使某些列包含 NULL 值。
  • 实现:MySQL 优化器会对 COUNT(*) 进行优化,将其转换为统计行数的操作。
  • 效率:通常是最常用和推荐的方式,因为其语义明确且优化器能够很好地处理。
  • 示例
    SELECT COUNT(*) FROM employees;
    
2. COUNT(1)
  • 定义COUNT(1) 计算查询结果集中的行数。1 在这里是一个常量值,表示每一行都会被计数。
  • 实现:在执行过程中,COUNT(1) 会将 1 作为一个非空的常量值,并对每一行进行计数。
  • 效率:现代的SQL优化器通常会将 COUNT(1)COUNT(*) 优化为相同的执行计划,因此性能基本相同。
  • 示例
    SELECT COUNT(1) FROM employees;
    
3. COUNT(列名)
  • 定义COUNT(列名) 计算查询结果集中某一列非 NULL 值的行数。只有当指定列的值不为 NULL 时,该行才会被计入结果。
  • 实现:需要检查每行中的特定列是否为 NULL,因此性能可能略低于 COUNT(*)COUNT(1)
  • 效率:由于需要进行 NULL 值检查,性能可能略低。
  • 示例
    SELECT COUNT(department_id) FROM employees;
    

性能比较

  • COUNT(*)COUNT(1):现代SQL优化器通常会将 COUNT(*)COUNT(1) 优化为相同的执行计划,因此在大多数情况下,它们的性能基本相同。
  • COUNT(列名):由于需要检查每行中的特定列是否为 NULL,性能可能略低。

特殊情况

  • 主键列:如果 COUNT(列名) 中的列是主键或唯一索引列,性能可能会优于 COUNT(1),因为主键列通常已经进行了优化。
  • 无主键表:如果表中没有主键,COUNT(1) 的性能可能会优于 COUNT(*),因为它不需要解析完整的行数据。

总结

  • COUNT(*):统计所有行,包括 NULL 值,性能通常最优,推荐使用。
  • COUNT(1):统计所有行,包括 NULL 值,性能与 COUNT(*) 相当。
  • COUNT(列名):统计指定列中非 NULL 值的行数,需要进行 NULL 值检查,性能可能略低。

在实际应用中,可以根据具体情况选择合适的 COUNT 函数,以达到最佳的性能和准确性。


http://www.kler.cn/a/416974.html

相关文章:

  • 海康VsionMaster学习笔记(学习工具+思路)
  • 架构-微服务-服务调用Dubbo
  • 【ArcGIS Pro实操第11期】经纬度数据转化成平面坐标数据
  • redis机制详解
  • 单细胞细胞通讯全流程分析教程,代做分析和辅导
  • Linux—进程学习—04(进程地址空间学习)
  • Spring Boot 项目——分层架构
  • C++设计模式:装饰器模式 (Decorator) (咖啡订单系统)
  • c++哈希(开散列原理及实现)
  • BUUCTF—Reverse—Java逆向解密(10)
  • 警钟长鸣,防微杜渐,遨游防爆手机如何护航安全生产?
  • Flink 离线计算
  • 【kafka02】消息队列与微服务之Kafka部署
  • 如何bug是前端还是后端
  • (即插即用模块-Attention部分) 二十、(2021) GAA 门控轴向注意力
  • 【Spring框架 二】
  • DimensionX 学习部署笔记
  • 大小写转换
  • Ubuntu 常用解压与压缩命令
  • 如何将WSL的虚拟机安装到任意目录中
  • Nginx和Apache有什么异同?
  • 关于NXP开源的MCU_boot的项目心得
  • Spring Boot 实战:分别基于 MyBatis 与 JdbcTemplate 的数据库操作方法实现与差异分析
  • 【QNX+Android虚拟化方案】125 - 如何创建android-spare镜像
  • 基于SpringBoot的欢迪迈手机商城架构设计
  • 从扩散模型开始的生成模型范式演变--SDE