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. 哪种方式更好&…...
laravel11设置中文语言包
安装中文语言包 Laravel 11 默认没有内置完整中文语言包,推荐使用第三方维护的完整翻译: # 通过 Composer 安装语言包 composer require laravel-lang/common --dev# 发布中文语言文件到项目 php artisan lang:add zh_CN这会自动将中文语言文件生成到 l…...
二、IDE集成DeepSeek保姆级教学(使用篇)
各位看官老爷好,如果还没有安装DeepSeek请查阅前一篇 一、IDE集成DeepSeek保姆级教学(安装篇) 一、DeepSeek在CodeGPT中使用教学 1.1、Edit Code 编辑代码 选中代码片段 —> 右键 —> CodeGPT —> Edit Code, 输入自然语言可编辑代码,点击S…...
网络七层模型—OSI参考模型详解
网络七层模型:OSI参考模型详解 引言 在网络通信的世界中,OSI(Open Systems Interconnection)参考模型是一个基础且核心的概念。它由国际标准化组织(ISO)于1984年提出,旨在为不同厂商的设备和应…...
四、Redis主从复制与读写分离
一、环境搭建 准备环境 IP角色192.168.10.101Master192.168.10.102Slave192.168.10.103Slave 创建配置/数据/日志目录 # 创建配置目录 mkdir -p /usr/local/redis/conf # 创建数据目录 mkdir -p /usr/local/redis/data # 创建日志目录 mkdir -p /usr/local/redis/log修改配置…...
爬虫框架与库
爬虫框架与库是用于网络数据抓取的核心工具,帮助开发者高效地从网页中提取结构化数据。 Requests:用于发送HTTP请求。 BeautifulSoup:用于解析HTML和XML。 Scrapy:强大的爬虫框架,适合大规模爬取。 Selenium&#…...
【保姆级视频教程(二)】YOLOv12训练数据集构建:标签格式转换-划分-YAML 配置 避坑指南 | 小白也能轻松玩转目标检测!
【2025全站首发】YOLOv12训练数据集构建:标签格式转换-划分-YAML 配置 避坑指南 | 小白也能轻松玩转目标检测! 文章目录 1. 数据集准备1.1 标签格式转换1.2 数据集划分1.3 yaml配置文件创建 2. 训练验证 1. 数据集准备 示例数据集下载链接:P…...
数据如何安全“过桥”?分类分级与风险评估,守护数据流通安全
信息化高速发展,数据已成为企业的核心资产,驱动着业务决策、创新与市场竞争力。随着数据开发利用不断深入,常态化的数据流通不仅促进了信息的快速传递与共享,还能帮助企业快速响应市场变化,把握商业机遇,实…...
本地大模型编程实战(24)用智能体(Agent)实现智能纠错的SQL数据库问答系统(3)
本文将实现这样一个 智能体(Agent) : 可以使用自然语言对 SQLite 数据库进行查询。即:用户用自然语言提出问题,智能体也用自然语言根据数据库的查询结果回答问题。增加一个自动对查询中的专有名词进行纠错的工具,这将明显提升查询…...
Apache DolphinScheduler系列1-单节点部署及测试报告
文章目录 整体说明一、部署环境二、版本号三、部署方案四、部署步骤4.1、上传部署包4.2、创建外部数据库4.3、修改元数据库配置4.4、上传MySQLl驱动程序4.5、初始化外部数据库4.6、启停服务4.7、访问页面五、常见问题及解决方式5.1、时间不一致5.2、异常终止5.3、大量日志5.4、…...
Java+SpringBoot+Vue+数据可视化的音乐推荐与可视化平台(程序+论文+讲解+安装+调试+售后)
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 在互联网技术以日新月异之势迅猛发展的浪潮下,5G 通信技术的普及、云计算能力…...
LVS+Keepalived 高可用集群搭建
一、高可用集群: 1.什么是高可用集群: 高可用集群(High Availability Cluster)是以减少服务中断时间为目地的服务器集群技术它通过保护用户的业务程序对外不间断提供的服务,把因软件、硬件、人为造成的故障对业务的影响…...
跟着AI学vue第十二章
第十二章:技术引领与社区共建 在熟练掌握Vue开发技能,并将其与前沿技术融合应用后, 第十二章是一个更具使命感与影响力的阶段,着重于引领技术发展方向和为社区贡献力量。 1. 推动Vue技术创新与实践 探索前沿技术融合࿱…...
PydanticToolsParser 工具(tool call)把 LLM 生成的文本转成结构化的数据(Pydantic 模型)过程中遇到的坑
PydanticToolsParser 的作用 PydanticToolsParser 是一个工具,主要作用是 把 LLM 生成的文本转成结构化的数据(Pydantic 模型),让代码更容易使用这些数据进行自动化处理。 换句话说,AI 生成的文本通常是自然语言&…...
python-leetcode-乘积最大子数组
152. 乘积最大子数组 - 力扣(LeetCode) class Solution:def maxProduct(self, nums: List[int]) -> int:if not nums:return 0max_prod nums[0]min_prod nums[0]result nums[0]for i in range(1, len(nums)):if nums[i] < 0:max_prod, min_prod…...
江协科技/江科大-51单片机入门教程——P[1-1] 课程简介P[1-2] 开发工具介绍及软件安装
本教程也力求在玩好单片机的同时了解一些计算机的基本概念,了解电脑的一些基本操作,了解电路及其元器件的基本理论,为我们学习更高级的单片机,入门IT和信息技术行业,打下一定的基础。 目录 1.课程简介 2.开发工具及…...
简单介绍JVM
1.什么是JVM? JVM就是Java虚拟机【Java Virtual Machine】,简称JVM。主要部分包括类加载子系统,运行时数据区,执行引擎,本地方法库等,接下来我们一一介绍 2.类加载子系统 JVM中运行的就是我们日常写的JA…...
【对话推荐系统】Towards Topic-Guided Conversational Recommender System 论文阅读
Towards Topic-Guided Conversational Recommender System 论文阅读 Abstract1 Introduction2 Related Work2.1 Conversation System2.2 Conversational Recommender System2.3 Dataset for Conversational Recommendation 3 Dataset Construction3.1 Collecting Movies for Re…...
当下弹幕互动游戏源码开发教程及功能逻辑分析
当下很多游戏开发者或者想学习游戏开发的人,想要了解如何制作弹幕互动游戏,比如直播平台上常见的那种,观众通过发送弹幕来影响游戏进程。需要涵盖教程的步骤和功能逻辑的分析。 首先,弹幕互动游戏源码开发教程部分应该分步骤&…...
STM32——HAL库开发笔记21(定时器2—输出比较)(参考来源:b站铁头山羊)
本文主要讲述输出比较及PWM信号相关知识。 一、概念 所谓输出比较,就是通过单片机的定时器向外输出精确定时的方波信号。 1.1 PWM信号 PWM信号即脉冲宽度调制信号。PWM信号的占空比 (高电压 所占周期 / 整个周期) * 100% 。所以PWM信号…...
YOLOv12 ——基于卷积神经网络的快速推理速度与注意力机制带来的增强性能结合
概述 实时目标检测对于许多实际应用来说已经变得至关重要,而Ultralytics公司开发的YOLO(You Only Look Once,只看一次)系列一直是最先进的模型系列,在速度和准确性之间提供了稳健的平衡。注意力机制的低效阻碍了它们在…...
动态内容加载的解决方案:Selenium与Playwright对比故障排查实录
方案进程 2024-09-01 09:00 | 接到亚航航班数据采集需求 2024-09-01 11:30 | 首次尝试使用Selenium遭遇Cloudflare验证 2024-09-01 14:00 | 切换Playwright方案仍触发反爬机制 2024-09-01 16:30 | 引入爬虫代理IPUA轮换策略 2024-09-02 10:00 | 双方案完整实现并通过压力测试故…...
NLP学习记录十:多头注意力
一、单头注意力 单头注意力的大致流程如下: ① 查询编码向量、键编码向量和值编码向量分别经过自己的全连接层(Wq、Wk、Wv)后得到查询Q、键K和值V; ② 查询Q和键K经过注意力评分函数(如:缩放点积运算&am…...
Spring基础01
Spring基础01 软件开发原则 OCP开闭原则:七大开发原则当中最基本的原则,其他的六个原则是为这个原则服务的。 对扩展开放,对修改关闭。在扩展系统功能的时候,没有修改之前写好的代码,就符合OCP原则,反之&a…...
Gurobi 并行计算的一些问题
最近尝试用 gurobi 进行并行计算,即同时用多个 cpu 核计算 gurobi 的 model,但是发现了不少问题。总体来看,gurobi 对并行计算的支持并不是那么好。 gurobi 官方对于并行计算的使用在这个网址,并有下面的大致代码: i…...
2025年2月,TVBOX接口最新汇总版
这里写自定义目录标题 1、离线版很必要2、关于在线版好还是离线版更实在,作个总结:★ 离线版的优点:★ 离线版的缺点: 3.1、 针对FM内置的写法;3.2、 如果是用在YSC,那么格式也要有些小小的改变3.2.1、 YSC…...
Dubbo RPC 原理
一、Dubbo 简介 Apache Dubbo 是一款高性能、轻量级的开源 RPC 框架,支持服务治理、协议扩展、负载均衡、容错机制等核心功能,广泛应用于微服务架构。其核心目标是解决分布式服务之间的高效通信与服务治理问题。 二、Dubbo 架构设计 1. 核心组件 Prov…...
qt5的中文乱码问题,QString、QStringLiteral 为 UTF-16 编码
qt5的中文乱码问题一直没有很明确的处理方案。 今天处理进程间通信时,也遇到了qt5乱码问题,一边是设置的GBK,一边设置的是UTF8,单向通信约定采用UTF8。 发送端保证发的是UTF8字符串,因为UTF8在网络数据包中没有字节序…...
第2章_保护您的第一个应用程序
第2章_保护您的第一个应用程序 在本章中,您将学习如何使用 Keycloak 保护您的第一个应用程序。为了让事情更有趣,您将运行的示例应用程序由两部分组成,前端 Web 应用程序和后端 REST API。这将向您展示用户如何向前端进行身份验证࿰…...
【Godot4.3】自定义圆角容器
概述 Godot控件想要完全实现现代UI风格,需要进行大量的自定义组件设计。本篇就依托于笔者自己对现代UI设计中的圆角面板元素模仿来制作圆角容器组件。 圆角容器 圆角元素在现代的扁平UI设计中非常常见,在Godot中可以通过改进PanelContainer来或者自定…...
