MySQL 使用 `WHERE` 子句时 `COUNT(*)`、`COUNT(1)` 和 `COUNT(column)` 的区别解析
文章目录
- 1. COUNT() 函数的基本作用
- 2. `COUNT(*)`、`COUNT(1)` 和 `COUNT(column)` 的详细对比
- 2.1 `COUNT(*)` —— 统计所有符合条件的行
- 2.2 `COUNT(1)` —— 统计所有符合条件的行
- 2.3 `COUNT(column)` —— 统计某一列非 NULL 的记录数
- 3. 性能对比
- 3.1 `EXPLAIN` 分析
- 4. 哪种方式更好?
- 4.1 如果只是统计行数:
- 4.2 统计某列的非 NULL 值:
- 4.3 `COUNT(1)` 是否比 `COUNT(*)` 快?
- 5. 结论
- **最佳实践**
在 MySQL 查询优化过程中,COUNT(*)、COUNT(1) 和 COUNT(column) 这三种计数方式常常被混淆,尤其是在使用 WHERE 子句进行数据筛选时,它们的执行效率和结果可能有所不同。本文将深入解析这三者的区别,并结合 SQL 执行原理和优化策略,帮助开发者更高效地使用 COUNT() 函数。
1. COUNT() 函数的基本作用
COUNT() 是 SQL 语言中的聚合函数之一,主要用于统计符合条件的记录数。不同的 COUNT() 变体在处理 NULL 值和优化策略方面有所不同。
常见的 COUNT() 语法包括:
COUNT(*):统计表中所有符合条件的行(包括NULL)。COUNT(1):统计表中所有符合条件的行,与COUNT(*)类似。COUNT(column):统计某一列中非 NULL 值的个数。
2. COUNT(*)、COUNT(1) 和 COUNT(column) 的详细对比
2.1 COUNT(*) —— 统计所有符合条件的行
COUNT(*) 计算所有符合 WHERE 条件的行数,不论这些行中的列是否包含 NULL 值。
示例:
SELECT COUNT(*) FROM users WHERE age > 18;
执行原理:
- MySQL 不会具体读取某一列的数据,而是统计符合
WHERE条件的行数。 - 在 InnoDB 存储引擎中,
COUNT(*)可以直接从索引中读取数据(如果合适的索引可用),性能较优。
适用场景:
- 需要统计表中所有符合条件的记录数,且不关心是否有
NULL值时,COUNT(*)是最佳选择。
2.2 COUNT(1) —— 统计所有符合条件的行
COUNT(1) 也是统计符合 WHERE 条件的行数,与 COUNT(*) 类似。
示例:
SELECT COUNT(1) FROM users WHERE age > 18;
执行原理:
COUNT(1)会在每一行返回1,然后统计这些1的个数。- 在 MySQL 优化器看来,
COUNT(1)和COUNT(*)的执行计划通常是相同的。 - 在没有合适索引时,InnoDB 仍需进行全表扫描(或者索引扫描),不会因为
COUNT(1)而有性能提升。
适用场景:
- 和
COUNT(*)作用几乎一致,但一般推荐使用COUNT(*),因为COUNT(*)更符合 SQL 规范,并能适用于所有数据库系统。
2.3 COUNT(column) —— 统计某一列非 NULL 的记录数
COUNT(column) 仅统计某一列中非 NULL 的记录数,而不会统计 NULL 值。
示例:
SELECT COUNT(email) FROM users WHERE age > 18;
执行原理:
- 只有
email列不为NULL的行才会被计入统计。 - MySQL 需要读取
email列的数据,以判断其是否为NULL,因此比COUNT(*)和COUNT(1)可能稍慢(如果email列没有索引)。
适用场景:
- 需要排除
NULL值时,比如统计已填写email地址的用户数量。
3. 性能对比
为了对比 COUNT(*)、COUNT(1) 和 COUNT(column) 的性能,我们进行如下实验:
假设有一个 users 表,其中 id 为主键,email 为可能包含 NULL 的列,数据如下:
| id | name | age | |
|---|---|---|---|
| 1 | 张三 | 20 | zhangsan@a.com |
| 2 | 李四 | 25 | NULL |
| 3 | 王五 | 22 | wangwu@b.com |
| 4 | 赵六 | 19 | NULL |
测试 SQL 及其返回结果如下:
SELECT COUNT(*) FROM users WHERE age > 18; -- 结果:3
SELECT COUNT(1) FROM users WHERE age > 18; -- 结果:3
SELECT COUNT(email) FROM users WHERE age > 18; -- 结果:2 (NULL 值被排除)
3.1 EXPLAIN 分析
如果 users 表的 email 没有索引,那么 COUNT(email) 需要扫描 email 列的数据,会比 COUNT(*) 略慢。
对于 COUNT(*) 和 COUNT(1),InnoDB 通常会直接使用主键索引进行优化,因此在大多数情况下,两者性能相同。
示例 EXPLAIN 结果:
EXPLAIN SELECT COUNT(*) FROM users WHERE age > 18;
| id | select_type | table | type | possible_keys | key | rows | Extra |
|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | users | index | NULL | PRIMARY | 3 | Using index |
Using index 表示 MySQL 直接利用索引进行优化,而无需扫描所有数据。
4. 哪种方式更好?
4.1 如果只是统计行数:
- 推荐使用
COUNT(*),因为它可以利用索引优化,并且与数据库无关,通用性更强。
4.2 统计某列的非 NULL 值:
- 使用
COUNT(column),但要注意 NULL 值不会被计入。
4.3 COUNT(1) 是否比 COUNT(*) 快?
- 在 MySQL 5.7 及以上版本,
COUNT(1)和COUNT(*)在优化器层面已经没有明显性能差异,因此一般推荐使用COUNT(*),更符合 SQL 规范。
5. 结论
| 计数方式 | 作用 | 处理 NULL | 性能优化 |
|---|---|---|---|
COUNT(*) | 统计符合 WHERE 条件的总行数 | 统计所有行(包括 NULL) | 最优(可利用索引) |
COUNT(1) | 统计符合 WHERE 条件的总行数 | 统计所有行(包括 NULL) | 与 COUNT(*) 类似 |
COUNT(column) | 统计某列非 NULL 的行数 | 只统计非 NULL 值 | 可能稍慢(依赖索引情况) |
最佳实践
- 默认使用
COUNT(*),它性能最优且兼容性强。 COUNT(column)适用于特定需求,如统计非 NULL 值个数。- 避免误解
COUNT(1)更快的说法,在现代 MySQL 中它与COUNT(*)无本质区别。
希望这篇文章能帮助你更深入理解 MySQL 计数函数的优化策略,提高查询性能!🚀
相关文章:
MySQL 使用 `WHERE` 子句时 `COUNT(*)`、`COUNT(1)` 和 `COUNT(column)` 的区别解析
文章目录 1. COUNT() 函数的基本作用2. COUNT(*)、COUNT(1) 和 COUNT(column) 的详细对比2.1 COUNT(*) —— 统计所有符合条件的行2.2 COUNT(1) —— 统计所有符合条件的行2.3 COUNT(column) —— 统计某一列非 NULL 的记录数 3. 性能对比3.1 EXPLAIN 分析 4. 哪种方式更好&…...
Linux运维——网络管理
Linux网络管理 一、Linux网络应用要点二、命令常见用法2.1、curl2.1.1、发送GET请求2.1.2、发送POST请求2.1.3、设置请求头2.1.4、处理cookies2.1.5、处理重定向2.1.6、调试和详细信息2.1.7、使用代理2.1.8、文件上传2.1.9、其它常用选项2.1.10、综合示例 2.2、wget2.2.1、基本…...
STM32CUBEIDE FreeRTOS操作教程(十三):task api 任务访问函数
STM32CUBEIDE FreeRTOS操作教程(十三):task api 任务访问函数 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件,不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开发板…...
Jmeter+Jenkins接口压力测试持续集成
项目介绍 接口功能测试应用: http://www.weather.com.cn/data/cityinfo/<city_code>.html 测试功能:获取对应城市的天气预报 请求方法:Get 压测脚本开发工具:jmeter 源码脚本位置: https://github.com/shife…...
深入浅出ES6:现代JavaScript的基石
ES6(ECMAScript 2015)是JavaScript语言的一次重大更新,引入了许多新特性,使JavaScript更加强大、优雅和易于维护。这些特性已经成为现代JavaScript开发的基石,掌握它们对于任何JavaScript开发者都至关重要。本文将深入…...
实现使用RBF(径向基函数)神经网络模拟二阶电机数学模型中的非线性干扰,以及使用WNN(小波神经网络)预测模型中的非线性函数来抵消迟滞影响的功能
下面将详细介绍如何实现使用RBF(径向基函数)神经网络模拟二阶电机数学模型中的非线性干扰,以及使用WNN(小波神经网络)预测模型中的非线性函数来抵消迟滞影响的功能。我们将按照以下步骤进行: 步骤1&#x…...
潜水泵,高效排水,守护城市与农田|深圳鼎跃
洪水是常见的自然灾害,在春夏季节的我国降水多为丰富,容易造成城市内部的洪涝灾害。特别是低洼地区的积水,不仅容易造成城市交通的出行不便,还存在潜在的隐患,严重影响了人们正常生活。 潜水泵作为一种高效、可靠的排水…...
易基因:RNA甲基化修饰和R-loop的交叉调控:从分子机制到临床意义|深度综述
大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 R-loop(RNA-DNA杂合结构)是转录调控、DNA复制和修复等关键细胞过程的重要组成部分。但R-loop异常积累可能会破坏基因组完整性,从而导致多种疾病的发生…...
115 道 MySQL 面试题,从简单到深入!
1. 什么是数据库事务? 数据库事务是一个作为单个逻辑工作单元执行的一系列操作。事务具有ACID属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性…...
一周学会Flask3 Python Web开发-flask3上下文全局变量session,g和current_app
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili flask3提供了session,g和current_app上下文全局变量来方便我们操作访问数据。 以下是一个表格,用于比较Flask中的…...
MFC学习笔记-1
一、编辑框和按钮 //.h文件private:CString str;//给窗口类加了一个变量(定义一个成员变量),关联到IDC_EDIT1中(要在实现中关联,源文件文件夹中)CString str2;//接收button2,和IDC_EDIT2绑定 p…...
Linux搜索查找类指令
1、find指令 基本语法:find [搜索范围] [选项] 功能:将从指定目录向下递归地遍历其各个子目录,将满足条件的文件或目录显示在终端。 常用选项: 操作 命令示例 说明 查找指定路径下的所有文件 find /path/to/dir 查找指定目…...
江协科技/江科大-51单片机入门教程——P[1-1] 课程简介P[1-2] 开发工具介绍及软件安装
本教程也力求在玩好单片机的同时了解一些计算机的基本概念,了解电脑的一些基本操作,了解电路及其元器件的基本理论,为我们学习更高级的单片机,入门IT和信息技术行业,打下一定的基础。 目录 1.课程简介 2.开发工具及…...
监听load和hashchange事件
监听load和hashchange事件 上篇文章中,我们已经将菜谱的数据给拿到,并且已经可以渲染到页面上,本篇我们将为程序添加一些事件; 注:本项目来自于Jonas Schmedtmann创建,文章仅仅作为学习作用! 菜…...
深度剖析Seata源码:解锁分布式事务处理的核心逻辑
文章目录 写在文章开头如何使用源码(配置转掉)基于AT模式详解Seata全链路流程Seata服务端启动本地服务如何基于GlobalTransaction注解开启事务客户端如何开启分布式事务RM和TC如何协调处理分支事务RM生成回滚日志事务全局提交与回滚小结参考写在文章开头 在当今分布式系统日益…...
在 Ansys Mechanical 中解决干涉拟合
有意和无意的过盈配合在工程设计和有限元分析 (FEA) 中很常见。当两个组件重叠或接触时,就会发生这种情况,从而产生应力和变形,必须仔细分析以确保功能正常。有意干涉,例如轴和轴承之间的压配合或用于固定金…...
JMeter性能问题
性能测试中TPS上不去的几种原因 性能测试中TPS上不去的几种原因_tps一直上不去-CSDN博客 网络带宽 连接池 垃圾回收机制 压测脚本 通信连接机制 数据库配置 硬件资源 压测机 业务逻辑 系统架构 CPU过高什么原因 性能问题分析-CPU偏高 - 西瓜汁拌面 - 博客园 US C…...
美国国防部(DoD)SysML v2迁移指南项目
DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 分享一篇SysML v1向SysML v2迁移的资料。 下载地址:https://ndia.dtic.mil/wp-content/uploads/2023/systems/Thurs_1560710_Stirk.pdf 核心内容用DeepSeek整理如下&#…...
JavaWeb-GenericServlet源码分析(适配器/模板方法)
文章目录 类直接实现Servlet接口的弊端Servlet接口的方法适配器设计模式 适配器对象的改造关于init方法的ServletConfig对象来源使用模板方法设计模式改造init方法 GenericServlet内置抽象类ServletConfig接口ServletConfig接口简介测试再谈GenericServlet抽象类 类直接实现Ser…...
微机原理与汇编语言试题四
一、单项选择 1.(单选题)()指向的内存单元的值被CPU做为指令执行。 A. DS:SI B. CS:IP C. SS:SP D. ES:DI 正确答案:B 2.(单选题)当RESET信号进入高电平状态时,将使8086的()寄存器初始化为0FFFFH A. SS B. DS C. ES D. CS 正确答案:D 3.(单选题)堆栈段寄存器是( …...
Windows平台APK批量安装实战:3种场景提升Android应用部署效率300%
Windows平台APK批量安装实战:3种场景提升Android应用部署效率300% 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在Android应用开发、测试和分发的工作流中…...
手机号查询QQ号:3步找回遗忘账号的终极指南
手机号查询QQ号:3步找回遗忘账号的终极指南 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 你是否曾经因为忘记QQ号而无法登录重要的工作群聊?是否因为更换手机导致QQ账号无法找回?现在࿰…...
013、语音风格迁移与控制:让 AI 模仿特定音色与语调
上周调试一个车载语音项目,客户提了个需求:“能不能让导航语音听起来像我们老板的声音?他录三句话就行。” 当时我心里咯噔一下——这要是搁两年前,得专门录几十小时数据重新训练模型,现在倒是可以试试风格迁移。今天我们就聊聊怎么让 TTS 开口说人话,还能带上点“人味儿…...
Vue2 页面白屏问题详细排查与处理方案
一、什么是「页面白屏」 白屏类型 表现 常见原因 完全白屏 页面一片空白,无任何内容 JS 报错、入口文件加载失败 路由白屏 进入某一路由后空白 路由配置错误、组件加载失败 部分白屏 只有某个区域空白 组件渲染异常、数据未返回 刷新白屏 首次正常,刷新…...
多模态提示注入攻击全链路复现(含PoC代码+防御规则库):当用户上传一张“正常”图片,却触发模型越权调用摄像头与麦克风…
第一章:多模态大模型安全与隐私保护 2026奇点智能技术大会(https://ml-summit.org) 多模态大模型在融合文本、图像、音频和视频等异构数据时,显著扩大了攻击面与隐私泄露风险。训练数据中隐含的敏感身份信息、版权内容或偏见模式可能被模型记忆并重构输…...
如何快速解密RPG游戏资源:5分钟掌握RPG Maker加密文件提取技巧
如何快速解密RPG游戏资源:5分钟掌握RPG Maker加密文件提取技巧 【免费下载链接】RPG-Maker-MV-Decrypter You can decrypt RPG-Maker-MV Resource Files with this project ~ If you dont wanna download it, you can use the Script on my HP: 项目地址: https:/…...
QMC解码器:3分钟解锁QQ音乐加密文件,实现跨平台音乐自由
QMC解码器:3分钟解锁QQ音乐加密文件,实现跨平台音乐自由 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 还在为QQ音乐下载的歌曲只能在特定应用播放…...
硬核算力集结!TMS320C6678、XC7K690T等、匠行科技SBC819模拟信号采集处理板,解锁高端测控新标杆
当信号捕捉遇上极致算力在雷达探测的精准回波中、在高速通信的基带信号流转里、在工业测控的实时监测场景下,信号采集与处理的精度、速度,直接决定系统的核心性能。传统板卡常面临算力不足、数据传输卡顿、环境适配性差等痛点,难以满足高端领…...
RealSense D435数据后处理指南:从rosbag到图片/视频的三种实用方法对比
RealSense D435数据后处理实战:三种rosbag转图片/视频方案深度评测 当你手握RealSense D435采集的rosbag数据时,是否曾为如何高效提取关键帧而头疼?作为计算机视觉和机器人领域的常用传感器,D435采集的RGB-D数据往往需要经过后处理…...
基于机器学习的智能预热算法
传统的缓存预热依赖静态规则(如LRU、LFU)或人工配置,无法适应动态变化的访问模式。机器学习(ML)通过学习历史访问模式、预测未来热点,实现缓存的自适应预热。本文从算法框架、模型选型、工程落地到生产实践,进行系统性剖析。 一、智能预热的总体框架 ML驱动的智能预热系…...
