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

embedded/2024/11/29 12:54:02/

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.ppmy.cn/embedded/141470.html

相关文章

RocketMQ MQTT Windows10 环境启动

RocketMQ MQTT Windows10 环境启动 参考环境和软件版本下载资源启动RocketMQ启动RocketMQ MQTT 参考 https://blog.csdn.net/weixin_43114058/article/details/140043257 https://blog.csdn.net/yangxiaovip/article/details/138355443 环境和软件版本 操作系统&#xff1a…

根据中缀二叉树构建中缀表达式

请设计一个算法,将给定的表达式树(二叉树)转换为等价的中缀表达式(通过括号反应操作符的计算次序)并输出,例如,当下列两棵表达式树作为算法的输入时: 输出的等价表达式分别为(ab)*(c…

Ubutuns服务器搭建与维护

1.靶机搭建 首先,安装 Apache2 作为 Web 服务器: sudo apt install apache2 安装完成后,可以启动 Apache 服务并确保它开机自启: sudo systemctl start apache2 sudo systemctl enable apache2然后,你可以通过访问…

适配器模式(一种设计模式)

适配器模式, 也叫包装器模式. 将⼀个类的接⼝,转换成客⼾期望的另⼀个接⼝, 适配器让原本接⼝不兼容的类可以合作无间。 简单来说就是⽬标类不能直接使⽤, 通过⼀个新类进⾏包装⼀下, 适配调⽤⽅使⽤. 把两个不兼容的接⼝通过⼀定的⽅式使之兼容. 回忆一下slf4j模式…

已解决WordPress图片无法显示,免插件实现WordPress上传图片时自动重命名

在我们使用 WordPress 发布文章时,经常都需要添加图片、多媒体什么的。然而,大家都知道 WordPress 是舶来物,对于中文用户来说,我们都会把图片命名为中文的,由于 WordPress 机制的原因,并不能正常的显示图片…

uniapp强制修改radio-group内单选组件的状态方法

在uniapp开发中,需要在radio-group内部切换时做判断,提醒客户是否要变换radio的值,但是大家知道radio是单选组件,往往你点击后,是不能再修改状态的,就算你在点击后做判断,修改current的值&#…

未成年人模式护航,保障安全健康上网

为保护未成年人的上网环境,预防未成年人沉迷网络,帮助未成年人培养积极健康的用网习惯,HarmonyOS SDK 提供未成年人模式功能,在华为设备上加强对面向未成年人的产品和服务的管理。 场景介绍(应用跟随系统未成年人模式…

Leetcode3208:交替组 II

题目描述: 给你一个整数数组 colors 和一个整数 k ,colors表示一个由红色和蓝色瓷砖组成的环,第 i 块瓷砖的颜色为 colors[i] : colors[i] 0 表示第 i 块瓷砖的颜色是 红色 。colors[i] 1 表示第 i 块瓷砖的颜色是 蓝色 。 环…