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

news/2024/11/29 18:35:36/

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/news/1550960.html

相关文章

C++和C中的volatile 关键字

在 C/C 中volatile 关键字的作用 1.防止编译器优化 编译器在编译程序时,为了提高程序的执行效率,会对代码进行优化。例如,当编译器发现一个变量的值在一段代码中没有被显式地改变时,它可能会将这个变量的值缓存到寄存器中&#…

C++练级计划-> 《IO流》iostream fstream sstream详解

如果是想全部过一遍就看完,如果想具体的了解某一个请点目录。因为有三种流的使用可能内容多 目录 流是什么? CIO流(iostream) io流的注意事项 cin和cout为什么能直接识别出类型和数据 fstream fstream的使用方法&#xff…

<<WTF-Solidity>>学习笔记(part 5-8)

part 5 : 数据位置 Solidity数据存储位置有三类:storage,memory和calldata。不同存储位置的gas成本不同。storage类型的数据存在链上,类似计算机的硬盘,消耗gas多;memory和calldata类型的临时存在内存里,消…

SQL:多字段混合去重后编号

SQL SERVER 库表存储人员记录,来自多种源数据,如果两条记录的 Name、Phone、Email 字段之一有重复,则说明这两条记录是同一个人。null 是数据未知,两条记录的字段都为 null 时表示两者默认不重复,是否重复要靠其他字段…

React Router v7正式发布:开启全栈框架新时代

概述 2024年11月22日,React Router团队宣布React Router v7正式发布。这一重大版本不仅将Remix的大量特性整合到了React Router中,还为React Router用户开启了全新的“框架模式”,使得开发者可以直接使用Remix的功能。这标志着React Router从…

设计有一个 “分布式软总线“ 系统,跨平台

设计一个 跨平台的分布式软总线 系统是为了实现不同设备间的通信,支持各种硬件平台和操作系统,且能够通过统一的协议进行互联互通。这样的系统通常用于物联网(IoT)场景、智能家居、智能制造、车联网等应用。以下是一个详细的设计方…

Spring Cloud Stream实现数据流处理

1.什么是Spring Cloud Stream? Spring Cloud Stream的核心是Stream,准确来讲Spring Cloud Stream提供了一整套数据流走向(流向)的API, 它的最终目的是使我们不关心数据的流入和写出,而只关心对数据的业务处…

Linux快速入门:3.硬盘分区与RHEL8系统安装

点击蓝字 | 关注我们 规划Linux的硬盘分区 在安装RHEL8前,我们先根据上节的内容Linux快速入门:2.Linux的文件系统和目录结构,对硬盘进行分区规划。 对于Linux初学者,在学习过程中建议分区方案越简单越好,只需要将硬盘分…