MySQL 中 COUNT (*) 与 COUNT (col) 区别

news/2025/12/17 10:48:50/文章来源:https://www.cnblogs.com/dbasql/p/19360894

MySQL 中 COUNT (*) 与 COUNT (col) 区别

一、功能本质:计数范围的 “天壤之别”

COUNT(*)与COUNT(col)的核心差异,在于是否排除 NULL 值,这直接决定了计数结果的不同,也是后续性能差异的根源。

1. COUNT (*):“不挑不拣”,计数所有行

COUNT(*)的作用是统计符合查询条件的所有行数,无论行中任何列是否为 NULL(包括主键允许 NULL 的极端情况)。它不关注具体列的内容,仅判断 “该行是否存在”,是对 “行存在性” 的计数。
示例:现有user表(1000 行数据),其中email列允许 NULL(共 50 行 NULL 值),执行COUNT(*):
mysql> SELECT COUNT(*) FROM user;
+----------+
| COUNT(*) |
+----------+
| 1000 | # 包含所有行,无视email是否为NULL
+----------+
1 row in set (0.02 sec)

2. COUNT (col):“挑三拣四”,仅算非 NULL 值

COUNT(col)(col为具体列名)仅统计该列值不为 NULL 的行数。若列中存在 NULL 值,这些行会被直接排除,结果必然小于或等于COUNT(*)。
仍用上述user表,执行COUNT(email):
mysql> SELECT COUNT(email) FROM user;
+--------------+
| COUNT(email) |
+--------------+
| 950 | # 排除了50行email为NULL的记录
+--------------+
1 row in set (0.05 sec)
⚠️ 注意:即使列定义为NOT NULL(如id列),COUNT(id)与COUNT(*)结果虽一致,但执行逻辑不同 ——COUNT(id)仍会隐性校验列值是否为 NULL(只是因NOT NULL约束无实际 NULL 值),而COUNT(*)无需此校验。

二、性能差异:引擎特性与列属性双重影响

MySQL 两大存储引擎(InnoDB/MyISAM)的核心机制不同,再结合列是否允许 NULL,直接导致COUNT(*)与COUNT(col)的性能差距显著。

1. InnoDB 引擎:事务优先,无行数缓存

InnoDB 支持事务和行锁,为保证事务隔离性(不同事务看到的行数可能不同),不缓存表的总行数,计数需实时计算,性能差异主要源于 “是否需判断 NULL”:
  • COUNT (*) 与 COUNT (NOT NULL 列):性能接近。InnoDB 会自动选择最小的索引(如主键索引)进行 “索引覆盖扫描”(无需访问表数据),直接通过索引计数。实测 100 万行表中,二者执行时间均约 0.03 秒;
  • COUNT (NULLABLE 列):性能骤降。因需逐行判断列值是否为 NULL,无法仅靠索引完成,必须扫描全表数据。同 100 万行表中,执行时间达 0.28 秒,是前两者的 9 倍多。

2. MyISAM 引擎:非事务,行数缓存加速

MyISAM 不支持事务和行锁,会在表头部缓存总行数,全表计数场景下性能差异更极端:
  • COUNT (*) 与 COUNT (NOT NULL 列):瞬间完成。直接读取缓存的行数,无需扫描表或索引,100 万行表执行时间为 0 秒;
  • COUNT (NULLABLE 列):性能灾难。需全表扫描判断 NULL 值,同 100 万行表执行时间达 1.5 秒,是 InnoDB 同场景的 5 倍,差距悬殊。
若查询带WHERE条件(如id 00),MyISAM 的行数缓存失效,需通过索引过滤后计数,此时COUNT(*)仍因无需判断 NULL 而快于COUNT(col)。

三、常见误区:COUNT (1) 比 COUNT (*) 更快?

很多开发者认为 “COUNT(1)只需计数常量 1,比COUNT(*)扫描所有列更快”,但实测与 MySQL 底层逻辑均证明:二者完全一致
COUNT(1)中的 “1” 是非 NULL 常量,MySQL 会将其视为 “每行都存在的非 NULL 值”,计数逻辑等同于 “统计所有行”,与COUNT(*)无区别:
  • 执行结果相同:对 100 万行表,COUNT(1)与COUNT(*)结果均为 100 万;
  • 执行性能相同:InnoDB 中二者执行时间均约 0.03 秒,MyISAM 中均为 0 秒;
  • 执行计划相同:均采用 “索引覆盖扫描”(Extra: Using index),无额外开销。
结论:COUNT(1)是COUNT(*)的 “语法变体”,无性能优势,无需刻意替换。

四、实践选择:该用哪个?怎么优化?

1. 函数选择优先级

  1. 优先用 COUNT (*):无论列是否为 NULL、无论引擎类型,COUNT(*)性能最优(或与其他函数持平),且结果为 “所有行的准确计数”,是通用首选;
  1. 仅当需统计非 NULL 值时用 COUNT (col):如 “统计绑定手机号的用户数”(手机号列允许 NULL),此时必须用COUNT(phone),无替代方案;
  1. 绝对避免用 COUNT (NULLABLE 列) 做全表计数:若仅需 “总行数”,用COUNT(*)替代,避免全表扫描。

2. 性能优化技巧

  • InnoDB 表
    • 为频繁计数的WHERE条件列建索引(如主键、唯一索引),确保索引覆盖扫描;
    • 非精确计数(如报表统计)用information_schema.tables获取估算值(速度快,误差 1%-5%):
SELECT TABLE_ROWS FROM information_schema.tables
WHERE TABLE_NAME = 'user' AND TABLE_SCHEMA = 'test_db';
  • MyISAM 表
    • 适合读多写少、无需事务的场景(如日志表),全表计数用COUNT(*);
    • 若需COUNT(NULLABLE列),建 “条件列 + 目标列” 联合索引(如idx(id, phone)),恢复索引覆盖扫描。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1030221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI如何帮你快速掌握Java基础知识?

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个Java基础学习助手应用,包含以下功能:1) 交互式Java语法解释器,输入代码片段自动解析语法结构;2) 常见编程错误自动检测与修正…

CH585 CH584 CH592 RF PHY/Basic 2.4G 包格式

射频(Radio Frequency ,RF):以下是RF物理层信号的主要构成部分:RF使用2.4 GHz的ISM(工业、科学和医疗)频段。在2.4 GHz频段中,RF占用了40个频道,每个频道有2 MHz的带宽。 RF信号的结构通常由RF包(RF Packet)…

Fiddler抓包神器:AI如何帮你自动分析网络请求

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个基于Fiddler的AI辅助分析工具,能够:1. 自动识别和分类常见的API请求模式 2. 根据历史请求智能生成Mock响应数据 3. 检测异常请求和潜在安全问题 4. …

CentOS 9在企业级Web服务中的实战部署

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个在CentOS 9上部署高可用Web服务的自动化脚本。包含Nginx配置模板、MySQL优化参数和负载均衡设置。脚本应支持一键部署,自动检测系统资源并优化配置。使用Bash编…

2025年铝箔翅片定制厂家权威推荐榜单:铝防爆箔/亲水铝箔/铝翅片源头厂家精选 - 品牌推荐官

铝箔翅片作为现代高效换热器的核心传热元件,其性能直接决定了空调、制冷设备、工业冷却装置及新能源热管理系统的能效、可靠性与紧凑性。随着“双碳”目标下各行业对节能要求的提升以及设备小型化、轻量化的趋势,市场…

2025年内衬不锈钢复合管品牌推荐:新澎内衬不锈钢复合管质量 - mypinpai

在流体输送管道领域,内衬不锈钢复合管凭借防腐性能优+成本可控的核心优势,成为净水输送、石油化工、航空煤油等场景的优选方案。但市场产品质量参差不齐,如何选到靠谱品牌?本文围绕新澎内衬不锈钢复合管质量怎样新…

事倍功半是蠢蛋69 TODO

注释中的TODO 当代码写到一半或者任务没有完成时,在注释中添加TODO,可以让IDEA在TODO中显示未完成的部分,直接定位;

忘记密码?3分钟快速解锁密码锁的技巧

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个密码锁快速解锁指南应用,根据用户输入的密码锁类型(数字、图案、指纹等),提供分步骤的图文/视频解锁教程。包含常见错误提示…

用Packet Tracer快速验证网络架构设计的3种方法

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个网络架构原型验证工具,基于Packet Tracer实现:1. 常见网络拓扑模板库 2. 配置导入/导出功能 3. AI辅助设计建议 4. 自动化测试脚本 5. 性能分析报告…

企业级Spring Boot项目中的AutoConfiguration.imports实战

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 为一个电商平台的Spring Boot项目创建自定义自动配置。首先定义3个自定义自动配置类:PaymentAutoConfiguration(支付)、InventoryAutoConfiguration(库存)和Recommendat…

JookDB在电商平台中的实战应用案例

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个电商平台演示系统,展示JookDB在以下场景的应用:1. 实时订单处理系统 2. 用户行为分析看板 3. 个性化推荐引擎。要求:使用JookDB作为主数…

《60天AI学习计划启动 | Day 38: 多会话 多 Tab 同步(前端层)》

Day 38:多会话 & 多 Tab 同步(前端层) 学习目标设计 多会话模型:当前会话 + 会话列表(标题/摘要/时间) 掌握 利用 localStorage + storage 事件 做多 Tab 状态同步 实现 简单的会话新建 / 重命名 / 归档逻辑…

传统网页存档vs互联网档案馆:效率对比分析

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个网页存档效率对比分析工具。功能:1. 模拟自行搭建存档系统的工作流程;2. 与互联网档案馆API进行对比测试;3. 测量并比较响应时间、存储空…

如何用AI一键生成Jupyter Notebook环境配置脚本

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个Python脚本,用于自动下载并配置Jupyter Notebook开发环境。要求:1. 自动检测系统类型(Windows/macOS/Linux)并执行对应安装命…

企业级Python环境部署实战 - 官方源的正确使用

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个企业级Python部署管理系统,功能包括:1)多节点批量下载Python官方安装包 2)自动校验文件完整性 3)生成部署报告 4)支持离线安装包制作 5)版本合规性检…

MySQL存储过程开发效率提升300%的秘诀

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 构建一个MySQL存储过程开发效率工具包,包含:1. 代码片段库(常用模式一键插入);2. 实时语法检查和性能分析;3.…

CMHHP实战:构建智能慢性病管理系统

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个慢性病管理系统,专注于糖尿病患者的日常管理。功能包括血糖数据记录、用药提醒、饮食建议和医生远程咨询。使用Flutter实现跨平台应用,后端使用Fire…

3步快速解决Windows安装配置错误

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个极简的Windows安装错误修复工具,专注于快速解决无法将Windows配置为在此计算机上运行问题。工具应:1) 三步操作完成诊断;2) 自动应用最常…

Promise.js在电商网站支付流程中的实战应用

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个电商支付流程模拟项目,使用Promise.js处理以下步骤:1.查询用户余额 2.验证支付密码 3.扣除账户金额 4.生成订单 5.发送支付通知。要求:1…

2025年年终伺服压机推荐:从技术参数到服务生态的全方位横评,附5款高适配性型号清单 - 品牌推荐

在制造业智能化转型浪潮席卷全球的今天,精密压装作为决定产品最终质量与性能的关键工序,其技术装备的升级已成为企业提升核心竞争力不可回避的战略议题。然而,面对市场上品牌林立、技术路线各异、宣传口径不一的伺服…