MySQL中count(*) 和 count(1)区别

MySQL 中 count(*) 和 count(1) 的异同

count() 函数的基本原理

语法:

COUNT(expr)

其中:

  • expr 可以是字段名、常量、表达式或星号 (*)。

用法:

count() 函数用于统计满足特定条件的记录数量。它可以有以下几种用法:

1. 统计所有记录数量:

SELECT COUNT(*) FROM table_name;

2. 统计特定字段不为 NULL 的记录数量:

SELECT COUNT(field_name) FROM table_name;

3. 统计满足条件的记录数量:

SELECT COUNT(*) FROM table_name WHERE condition;

示例:

示例 1:统计表中所有记录数量

mysql> SELECT COUNT(*) FROM customers;
+----------+
| COUNT(*) |
+----------+
| 1000     |
+----------+

示例 2:统计特定字段不为 NULL 的记录数量

mysql> SELECT COUNT(name) FROM customers;
+----------+
| COUNT(name) |
+----------+
| 950       |
+----------+

示例 3:统计满足条件的记录数量

mysql> SELECT COUNT(*) FROM customers WHERE age > 30;
+----------+
| COUNT(*) |
+----------+
| 500       |
+----------+

COUNT(*) vs COUNT(1)

在使用COUNT函数时,我们可以选择使用SELECT COUNT(*)或SELECT COUNT(1)两种方式进行计数。这两种方式在实现上并没有明显的差别,都可以得到相同的结果。然而,它们在语义上略有不同。

  • SELECT COUNT(*): 这种方式表示计算表中所有行的数量,包括非空记录和空记录。它会统计表中的所有行,不论其是否为空。
  • SELECT COUNT(1): 这种方式表示计算表中每行的行号,也就是在内存中为每一行分配的唯一标识符。与COUNT(*)不同,它只计算非空记录,忽略了空记录。

因此,当表中存在大量空记录时,使用SELECT COUNT(*)会比SELECT COUNT(1)更加耗费资源,因为前者会统计空记录,而后者则会忽略它们。

尽管 count(*)count(1) 在大多数情况下性能相似,但以下情况可能会导致细微的差异:

  • count(字段名): 当指定的字段不是索引的一部分时,其性能可能较差,因为需要检查每条记录中的该字段是否为 NULL。

  • 多个二级索引: 如果表有多个二级索引,MySQL 优化器会选择具有最小 key_len 的索引进行扫描。

  • 主键索引 vs 二级索引: 只有当没有二级索引时,才会使用主键索引进行计数,这可能会略微降低效率。

如何优化 count()?

在面对大表的记录统计时,使用count()函数可能会导致性能问题,特别是当表中包含大量数据时。在这种情况下,我们可以考虑一些优化策略来提高查询效率。

1. 近似值统计

如果业务对于记录数的精确性要求不高,可以使用近似值来加速统计。例如,搜索引擎在显示搜索结果数量时通常使用的是近似值,而不是精确值。在MySQL中,可以使用show table statusexplain命令来获取表的估算记录数,因为这些命令执行效率很高,不会真正执行查询操作。

采用select语句查询表中共有 1200+ 万条记录,我也创建了二级索引,但是执行一次 select count(*) from t_order 要花费差不多 5 秒!

图片

而执行 explain 命令效率是很高的,因为它并不会真正的去查询,大概0.0004s就完成了

图片

2. 额外表保存计数值

对于需要精确获取记录总数的情况,可以考虑将计数值保存到单独的计数表中。每当在数据表中插入或删除记录时,同时更新计数表中的计数字段。这样,在查询记录总数时就不需要执行count()函数,而是直接查询计数表中的值,从而避免了对大表进行全表扫描的开销。

虽然这种方法提高了查询效率,但需要注意额外维护计数表的成本,特别是在新增和删除操作频繁的情况下,需要确保计数表的数据与实际数据表中的数据保持一致。

哪种 count 性能最好?

关于它们的执行效率的说法比较多,结合我自己的实践得出的比较认同的结论是:

count(*) = count(1) >= count(列名)

在实践中,关于MySQL和Oracle数据库中的count函数,人们对其执行效率有许多不同的说法。通过我的实践和观察,我得出了以下比较认同的结论:

对于 count(*) 和 count(1),在MySQL的官方文档中已明确说明,InnoDB存储引擎对它们的处理方式是一样的,因此它们之间没有区别。

对于Oracle数据库,虽然我没有找到官方的解释,但通过观察它们的执行计划,我认为 count(*) 和 count(1) 的执行计划是一样的。尽管有些人提到它们的效率可能有细微的差异,但在实际应用中很少会出现不带where条件统计全表的情况,因此我认为这个性能差异并不值得过多关注。

最后是 count(列名)。由于 count(列名) 需要多一个判断列是否为空的步骤,所以理所当然地比前两种要慢一些。然而,我发现如果列上有非空约束,那么在Oracle数据库中,count(列名) 和 count(*) 一样,都会使用索引优化。但在MySQL中,如果该列上没有索引,count(列名) 就不会使用索引。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【带你了解下前端开发语言有那些】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

JavaEE初阶之线程安全(一)

目录 题外话 正题 1.线程调度是随机的 2.修改共享数据 知识点 线程同步机制 线程异步机制 举例说明 synchronized() 知识点 举例说明 举例代码详解 死锁 举个例子: 代码 小结 题外话 这两天忽冷忽热的感冒了,昨天状态特别不好断更了一天,今天继续加油! 我会把…

【RT_Thread】---stm32f407zgt6使用env配置工程

用rt_thread env配置工程 1. git rt_thread 源码 2.找到对应芯片厂家扳机支持包 3 重新命名一个自己项目的工程 4 打开env 配置驱动 具体参考官方:Env 用户手册 (rt-thread.org) 5 修改路径为英文 6 修改完boad init 就应该可以用了(还有系统时钟不然会有问题)…

基于stm32的h5的spi屏幕调试

基于stm32的h5的spi屏幕调试 本文目标:基于stm32的基础实验 按照本文的描述,应该可以跑通实验并举一反三。 先决条件:装有编译和集成的开发环境,比如:Keil uVision5、STM32CubeMX 使用外设:GPIO、SPI …

Redis中的复制功能(一)

复制 概述 在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave),如图所示…

Python 全栈体系【四阶】(十八)

第五章 深度学习 一、基本理论 4. 神经网络的改进 4.1 神经网络的局限 全连接神经网络的局限(一) 未考虑数据的“形状”,会破坏数据空间结构。例如,输入数据是图像时,图像通常是高长通道方向上的 3 维形状。但是&a…

基于springboot+vue实现的房源出租信息系统

作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】:Java 【框架】:spring…

Java学习之类和对象、内存底层

目录 表格结构和类结构 表格的动作和类的方法 与面向过程的区别 具体实现 对象和类的详解 类的定义 属性(field 成员变量) 方法 示例--编写简单的学生类 简单内存分析(理解面向对象) 构造方法(构造器 constructor) 声明格式: 四…

深入探究Shrio反序列化漏洞

Shrio反序列化漏洞 什么是shrio反序列化漏洞环境搭建漏洞判断rememberMe解密流程代码分析第一层解密第二层解密2.1层解密2.2层解密 exp 什么是shrio反序列化漏洞 Shiro是Apache的一个强大且易用的Java安全框架,用于执行身份验证、授权、密码和会话管理。使用 Shiro 易于理解的…

FittenChat:程序员写代码的最好辅助利器,没有之一

🍁 作者:知识浅谈,CSDN签约讲师,CSDN博客专家,华为云云享专家,阿里云专家博主 📌 擅长领域:全栈工程师,大模型,爬虫、ACM算法 💒 公众号&#xff…

如何评估基于指令微调的视觉语言模型的各项能力-MMBench论文解读

1. 传统基准的固有局限 VQAv2:视觉问题回答数据集,主要用于评估视觉理解与推理能力。COCO Caption:图像描述生成数据集,用于评估模型对图像内容的理解与描述能力。GQA:结合常识的视觉问题回答数据集。OK-VQA:需要外部知识的视觉问题回答数据集。TextVQA:图像中包含文本的…

Linux系统网络的实时性评估

目录 1.使用 cyclictest 测试系统实时性2.测试系统通信实时性2.1 PingPlotter2.2 使用 ping 测试通讯实时性 3. 使用 iperf 测试带宽4.网络性能测试 1.使用 cyclictest 测试系统实时性 安装cyclictest sudo apt-get update sudo apt-get install rt-testscyclictest -p 99 -i…

TS学习01 基本类型、编译选项、打包ts代码

TS学习 TypeScript00 概念01 开发环境搭建02 基本类型基本使用⭐类型 03 编译选项tsconfig.jsoncompilerOptions语法检查相关 04 webpack打包ts代码错误解决 05 babel TypeScript BV1Xy4y1v7S2学习笔记 00 概念 以 JavaScript 为基础构建的语言 一个 JavaScript 的超集 Type…

如何使用KST指标进行多头交易,Anzo Capital一个条件设置

在之前的文章中,我们进行分享了以下知识:什么是KST指标,以及如何进行计算KST指标。有聪明的投资者就在后台进行咨询Anzo Capital昂首资本了,我们知道这些知识有什么用呢? 当然有用了,只要理解背后的逻辑知…

三层架构实验--对抗遗忘

交换配置顺序: channel vlan Trunk stp svi vrrp dhcp 绑定channel [sw1]interface e [sw1]interface Eth-Trunk 0 [sw1-Eth-Trunk0]int g 0/0/22 [sw1-GigabitEthernet0/0/22]eth-trunk 0 [sw1-GigabitEthernet0/0/23]eth-trunk 0 [sw2]interface Eth…

【语言信号增强算法研究-1】维纳滤波(Wiener Filter)

1 语音增强方法分类 2 维纳滤波的局限性 对于非线性和非高斯噪声的处理效果不佳; 对于信号和噪声的统计特性要求比较高,需要准确地了解信号和噪声的分布规律(说明自适应很差); 在处理复杂信号时,需要进行多…

副业赚钱攻略:给工资低的你6个实用建议,闷声致富不是梦

经常有朋友向我咨询,哪些副业比较靠谱且能赚钱。实际上,对于大多数打工族而言,副业不仅是增加收入的途径,更是利用业余时间提升自我、实现价值的重要方式。 鉴于此,今天我想和大家分享六个值得尝试的副业,…

sql注入---Union注入

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 学习目标 了解union注入过程中用到的关键数据库,数据表,数据列sql查询中group_concat的作用使用union注入拿到靶机中数据库里的所有用户名和密码 一. 获得数据库表名和列…

CDN流量清洗

CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率,因此CDN也用到了负载均衡技术。…

57、FreeRTOS/串口通信和DMA ADC PWM相关20240401

一、使用PWMADC光敏电阻完成光控灯的实验。(根据测得的光敏电阻大小,控制灯的亮度) 代码: /* USER CODE BEGIN 2 */HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);//打开定时器的PWM通道3HAL_TIM_PWM_Start(&htim3,TIM_CHANN…