MySql 执行count(1)、count(*) 与 count(列名) 区别

news2025/7/9 14:19:02

MySql 执行count(1)、count(*) 与 count(列名) 区别

在这里插入图片描述

1. 初识 count

  1. COUNT(expr) ,返回 SELECT 语句检索的行中 expr 的值不为NULL的数量。结果是一个 BIGINT 值。

  2. 如果查询结果没有命中任何记录,则返回 0。

  3. COUNT(*) 的统计结果中,会包含值为 NULL 的行数。

除了 COUNT(id)COUNT(*) 以外,还可以使用 COUNT(常量)(如 COUNT(1) )来统计行数。

2. COUNT(列名)、COUNT(1)和COUNT(*)之间的区别

执行效果上:

  1. count(*) 包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为 NULL
  2. count(1) 包括了忽略所有列(不专门统计哪一列,只要有数据,就代表一行),用1代表代码行,在统计结果的时候,不会忽略列值为 NULL
  3. count(列名) 只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者 0,而是表示 null)的计数,即某个字段值为 NULL 时,不统计。

执行效率上:

count(主键) count(*) count(1) 效率远高于 count(非主键列)

  • count(*) count(1), count(列,主键) 执行计划基本上是一样的。
  • count(列名(非主键)) 的执行计划 type = All 是进行的全表扫描,而 count(*) count(1), count(列,主键)typenull,执行时甚至不用访问表。

MySQL5.7 文档中有一段话:

InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.

For MyISAM tables, COUNT(*) is optimized to return very quickly if the SELECT retrieves from one table, no other columns are retrieved, and there is no WHERE clause.This optimization only applies to MyISAM tables, because an exact row count is stored for this storage engine and can be accessed very quickly. COUNT(1) is only subject to the same optimization if the first column is defined as NOT NULL.

InnoDB 以同样的方式处理 SELECT COUNT(*) 和 SELECT COUNT(1) 操作。两者没有性能差异。

对于 MyISAM 表,如果 SELECT 从一个表中检索,没有检索其他列,也没有 WHERE 子句,那么 COUNT(*) 被优化为快速返回。这种优化只适用于 MyISAM 表,因为这个存储引擎存储了准确的行数,并且可以非常快速地访问。COUNT(1) 只有在第一列被定义为 NOT NULL 时才进行与 COUNT(*) 相同的优化。

3. MyISAM

MyISAM 在统计表的总行数的时候会很快,但是有个大前提,不能加有任何 WHERE 条件。这是因为:MyISAM 对于表的行数做了优化,具体做法是有一个变量存储了表的行数,如果查询条件没有 WHERE 条件则是查询表中一共有多少条数据,MyISAM 可以做到迅速返回,所以也解释了如果加 WHERE 条件,则该优化就不起作用了。细心的同学会发现,innodb 的表也有这么一个存储了表行数的变量,但是很遗憾这个值是一个估计值,没有什么实际意义。

4. Innodb

COUNT() 函数的具体含义:

COUNT() 有两个非常不同的作用:

  • 它可以统计某个列值的数量,也可以统计行数。
  • 在统计列值时要求列值是非空的(不统计 NULL)。如果在 COUNT(expr) 的括号中定了列或者列表达式,则统计的就是这个表达式有值的结果数。
  • COUNT() 的另一个作用是统计结果集的行数。当 MySQL 确认括号内的表达式值不可能为空时,实际上就是在统计行数。最简单的就是当我们使用 COUNT(*) 的时候,这种情况下通配符 ***** 并不像我们猜想的那样扩展成所有的列,实际上,他会忽略所有列而直接统计所有的行数“——《高性能MySQL》

Innodb COUNT 用法:

如果该表只有一个主键索引,没有任何二级索引的情况下,那么 COUNT(*) 和 COUNT(1) 都是通过通过主键索引来统计行数的。如果该表有二级索引,则COUNT(1) 和 COUNT(*) 都会通过占用空间最小的字段的二级索引进行统计。

原理

目前基于磁盘的数据库或者搜索引擎(比如 Lucene)的性能瓶颈主要都是在 IO 阶段,相比于 CPURAMIO 操作实在太慢了,所以这类系统的优化方向也都都是类似的——尽一切可能减少 IO 的次数(所以很多用 ES 的程序在性能优化到极限的时候选择直接上 SSD)。这里统计行数的操作,查询优化器的优化方向就是选择能够让 IO 次数最少的索引,也就是基于占用空间最小的字段所建的索引(每次 IO 读取的数据量是固定的,索引占用的空间越小所需的 IO 次数也就越少)。而 Innodb 的主键索引是聚簇索引(包含了 KEY,除了 KEY 之外的其他字段值,事务 IDMVCC 回滚指针)所以主键索引一定会比二级索引(包含 KEY 和对应的主键 ID)大,也就是说在有二级索引的情况下,一般 COUNT() 都不会通过主键索引来统计行数,在有多个二级索引的情况下选择占用空间最小的。

如果说有张 Innodb 的表只有主键索引,而且记录还比较大(比如30K),则统计行的操作会非常慢,因为 IO 次数会很多(这里就不做实验截图了,有兴趣可以自己试一下)。一个优化方案就是预先建一个小字段并建二级索引专门用来统计行数,极端情况下这种优化速度提高上千倍也是正常的。

结论

  • COUNT(1) 和 COUNT(*) 执行优化器的优化是完全一样的,并没有 COUNT(1) 会比 COUNT(*) 快这个说法。

  • COUNT(列名) 需要进行字段的非 NULL 判断,所以效率会低一些。

当然遇到有些情况优化器的选择也不一定总是最优的,如果你坚持要用索引,可以通过 FORCE INDEX 来强制指定你要使用的索引。

参考:

MySQL学习笔记:count(1)、count(*)、count(字段)的区别 - Hider1214 - 博客园 (cnblogs.com)

MYSQL 下 count(*)、count(列)、 count(1) 理解 - 腾讯云开发者社区-腾讯云 (tencent.com)

高性能MySQL——Count(1) OR Count(*)? - 知乎 (zhihu.com)

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

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

相关文章

一篇文章,带你了解CodeTour与入门指导

CodeTour(代码之旅)是微软官方开发的 VS Code 扩展,允许记录和回放代码的演练和思路。 简介 CodeTour 是一个 VS Code 插件,允许记录和回放代码库的演练和思路。我们通常都是通过代码注释或者文档来解释某段代码或方法的功能及逻…

【Linux】权限管理-权限的概念,umask,粘滞位

文章目录shell命令以及运行原理Linux权限的概念用户间的权限切换su和su -的区别仅提升当前指令的权限Linux权限管理文件访问者的分类(人)文件类型和访问权限(事物属性)文件权限值的表示方法字符表示方法8进制数值表示方法文件访问权限的相关设置方法改变…

前端项目中资源请求顺序和dom结构顺序不一致,资源启动器有(索引)解析器和脚本

红色框资源是在组件1中 绿色框资源是在组件2中 在页面 DOM 结构中组件顺序是,从上到下:组件1->组件2 但是查看 chrome调试工具的网络请求,发现绿色资源先请求,并且像是请求完才会去请求红色资源,它们启动器那一栏…

C++语法——make_heap、push_heap、pop_heap、sort_heap使用介绍

目录 一.make_heap(...) 二.push_heap(...) 三.pop_heap(...) 四.sort_heap(...) 这三个函数位于<algorithm>头文件中。 可以看这篇文章了解堆排序&#xff1a;手把手教你堆排序 一.make_heap(...) 这是该函数的官方定义&#xff1a; 这个函数用于建立堆。 前两个…

Linux日志管理logrotate日志轮转

文章目录 前言 日志轮转简介 工作原理 配置文件种类 观察主文件和子文件 主配置文件介绍 yum日志轮转示例 配置轮转规则 rotate 3演示 总结 前言 上篇文章学习了系统日志管理&#xff0c;对于日志来讲他是占内存的&#xff0c;当有大量的日志产生的时候&#xff0c;会…

一个简单HTML5期末考核大作业,学生个人html静态网页制作代码

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

m基于PSO粒子群优化的第四方物流的作业整合算法matlab仿真,对比有代理人和无代理人两种模式下最低运输费用、代理人转换费用、运输方式转化费用和时间惩罚费用

目录 1.算法概述 2.仿真效果预览 3.核心MATLAB程序 4.完整MATLAB程序 1.算法概述 粒子群优化 (PSO)算法是通过模拟鸟群觅食过程中的迁徙和群聚行为而提出的一种基于群体智能的全局随机搜索算法。PSO是将群体(swarm)中的个体看作是在D维搜索空间中没有质量和体积的粒子(part…

Paddle入门实战系列(一):基于PaddleOCR的车牌识别

✨写在前面&#xff1a;强烈推荐给大家一个优秀的人工智能学习网站&#xff0c;内容包括人工智能基础、机器学习、深度学习神经网络等&#xff0c;详细介绍各部分概念及实战教程&#xff0c;通俗易懂&#xff0c;非常适合人工智能领域初学者及研究者学习。➡️点击跳转到网站。…

MySQL十秒插入百万条数据

mysql数据库准备 private String Driver "com.mysql.cj.jdbc.Driver";private String url "jdbc:mysql://localhost:3306/mp?serverTimezoneAsia/Shanghai&rewriteBatchedStatementstrue";private String user "root";private String pa…

Pycharm 翻译插件失效(transaction) 问题解决【包括安装视频教程】

嗨害大家好鸭&#xff01;我是小熊猫❤ 最近有很多朋友反应 翻译插件用不了了(不想看文章的朋友 可以直接点击文章最下方QQ群 领取视频版教程) 那么今天&#xff01;&#xff01;&#xff01; 教大家如何快速解决这个问题 点击文件(file) —> 设置(setting) 点击工具(t…

【附源码】计算机毕业设计JAVA家庭园艺服务平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

【Node.js】 第四章 模块化

目录 1. 模块化的概念 1.1 模块化的概念 1.2 模块化规范 2. Node.js中的模块化 2.1 模块分类 2.2 模块加载 2.3 模块作用域 2.4 向外共享模块成员 2.5 exports对象 2.6 Node.js中的模块化规范 1. 模块化的概念 1.1 模块化的概念 按照模块指定规则&#xff0c;把一…

什么是智能合约?新手入门指南

智能合约&#xff0c;也称为数字合约&#xff0c;在计算机网络中使用区块链技术来履行预编程的合约当合同的条件得到满足时&#xff0c;智能合同就会执行&#xff0c;例如向合同的一方发送付款。 智能合约之所以具有吸引力有多种原因&#xff1a; 不信任。由于智能合约及其条…

【c++ 】 对象与类中方法的调用关系。类中常方法,普通方法,静态方法之间互相的调用关系

对象与类中方法的调用关系。类中常方法&#xff0c;普通方法&#xff0c;静态方法之间互相的调用关系1.对象与方法之间的调用1.常对象只能调用常成员方法2.普通对象既可以调用普通成员方法&#xff0c;也可以调用常成员方法&#xff0c;当两个同名的常成员方法和普通成员方法重…

你安全吗?丨秦淮到底是哪种黑客?你猜对了吗?

作者&#xff1a;黑蛋 大家都知道黑客&#xff0c;但是黑客也分很多种类&#xff0c;那么秦淮属于哪种黑客呢&#xff0c;我们先来看一看黑客的种类&#xff1a; 1、白帽黑客&#xff1a;白帽黑客是指通过实施渗透测试&#xff0c;识别网络安全漏洞&#xff0c;为政府及组织工…

蓝桥杯入门即劝退(九)罗马数字

“为什么你没有变强&#xff0c;因为你最近一直过得太舒服” ----------持续更新蓝桥杯入门系列算法实例------------- 如果你也喜欢Java和算法&#xff0c;欢迎订阅专栏共同学习交流&#xff01; 你的点赞、关注、评论、是我创作的动力&#xff01; -------希望我的文章对你有…

数字孪生3d智慧核电可视化场景应用展示,包括:智能计算,智能运维

最近几年来&#xff0c;数字孪生技术已被应用于核电领域&#xff0c;并且国内已有一些公司在具体实践过程中&#xff0c;通过数字孪生赋能核电更加经济、灵活、高效运维。 北京智汇云舟科技有限公司成立于2012年&#xff0c;专注于创新性的“视频孪生&#xff08;实时实景数字孪…

c++ 正则表达式

文章目录正则表达式基本语句regex_matchregex_searchregex_token_iteratorregex_replace示例匹配电话号码匹配QQ号码匹配IP地址正则表达式 什么是正则表达式&#xff1f; 正则表达式(regular expression)描述了一种字符串匹配的模式&#xff08;pattern&#xff09;&#xff0…

GENERALIZATION THROUGH MEMORIZATION: NEAREST NEIGHBOR LANGUAGE MODELS

Abatract 我们引入了kNN-LMs&#xff0c;它扩展了一个预先训练的神经语言模型&#xff08;LM&#xff09;&#xff0c;通过与k个最近邻&#xff08;kNN&#xff09;模型线性插值。最近邻是根据预先训练好的LM嵌入空间中的距离进行计算的&#xff0c;并可以从任何文本集合中提取…

45-命令行基础操作

45-命令行基础操作LInux命令行基础LInux命令基础知识Linux的Gul与CLI为什么使用Linux命令行Linux命令语法格式Linux命令分类LInux基础命令登录命令电源管理命令电源命令1: shutdown电源命令2: halt电源命令3: reboot文件管理命令Linux文件目录结构(1)Linux文件路径帮助命令目录…