COUNT(*)、COUNT(1)、COUNT(某一列)的区别是什么?哪个性能更好

一些特殊情况:

  • 有索引时:如果查询使用了索引,且查询的列在索引中,COUNT(某一列) 可能在某些情况下会比较快,因为数据库只需要扫描索引,而不需要扫描整个表。
  • 有 NULL 值时COUNT(某一列) 可能会因为 NULL 值的过滤而表现出与其他方法不同的性能特征。
  • WHERE 子句:无论是 COUNT(*)COUNT(1), 还是 COUNT(某一列),它们在有 WHERE 子句时,都会受限于条件的筛选,性能可能会受到查询条件的影响。

结论:

  • 对于大多数查询,推荐使用 COUNT(*),因为它通常是数据库最优化的选择。
  • COUNT(1) 性能与 COUNT(*) 基本相同,因此可以作为备选。
  • COUNT(某一列) 由于需要检查列值是否为 NULL,通常会稍微慢一些,特别是在数据中有大量 NULL 时。

一        介绍

1、COUNT(*):

这个表达式会计算表中的所有行,包括那些值为NULL的行。它不考虑列的选择,直接统计整个表的行数。

        MySQL官网[1]中有说明:InnoDB通过遍历最小的可用二级索引来处理SELECT COUNT(*)语句,除非索引或优化器提示优化器使用不同的索引。如果二级索引不存在,InnoDB通过扫描聚簇索引来处理SELECT COUNT(*)语句。

        为什么要采用遍历最小的可用二级索引,而不是直接选聚簇索引?

        因为二级索引不存储具体数据,相比聚簇索引占用空间小,遍历的I/O效率更高。

2、COUNT(1):

        这是一个优化过的计数方式,实际上并不计算任何列的值,而是把“1”作为一个常量来对待,统计的是满足条件的行数。这种方式避免了访问表的具体列,理论上可以提高效率,尤其是在列值可为空的情况下。

        MySQL官网[1]中有说明:InnoDB处理SELECT COUNT(*)和SELECT COUNT(1)操作的方式相同。

3、COUNT(某一列):

        这个表达式统计的是指定列中非NULL值的数量。如果该列有NULL值,那么这些行不会被计入总数中。

二        区别

1、数据处理范围:

        COUNT(*)包括了所有行,无论列值是否为NULL;COUNT(1)同样统计所有行,因为它计数的是恒定的1,不关心行数据的实际内容;而COUNT(某一列)只统计该列非NULL值的行数。

2、性能影响因素:

        由于COUNT(*)COUNT(1)不需要访问实际的数据行(特别是当索引可以覆盖查询需求时),它们的执行效率可能高于COUNT(某一列),特别是当该列含有大量NULL值时。

3、应用场景:

        如果你需要统计表的所有行数,包括那些具有NULL值的行,应使用COUNT(*)COUNT(1)。若你需要统计特定列的非NULL值数量,则应使用COUNT(某一列)

三        性能比较

        1、在MySQL中,COUNT(*)COUNT(1)的性能差异微乎其微,甚至可以认为是等价的。在MySQL官网中,明确指出InnoDB引擎中两语句性能一致[1]。原文如下:

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

        2、相比之下,COUNT(某一列)的性能取决于该列的数据分布,特别是NULL值的比例。如果该列包含大量NULL值,且查询优化器无法有效利用索引,那么它的执行效率可能会低于前两者。其中COUNT(主键)相比COUNT(普通列)的性能要好。

        3、实际性能还受到数据库索引、表结构、数据量、以及数据库管理系统具体实现等因素的影响。因此,在特定场景下,需进行实际测试。

四        结语

        总的来说,COUNT(*)COUNT(1)在统计全表行数时非常相似,且在多数情况下性能相当,推荐在不需要考虑特定列的NULL值时使用。而COUNT(某一列)则适用于需要精确统计某列非NULL值数量的场景。在考虑性能优化时,了解并利用数据库的特定优化特性和执行计划分析工具,可以帮助做出更合适的选择。

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

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

相关文章

C/C++流星雨

系列文章 序号直达链接1C/C爱心代码2C/C跳动的爱心3C/C李峋同款跳动的爱心代码4C/C满屏飘字表白代码5C/C大雪纷飞代码6C/C烟花代码7C/C黑客帝国同款字母雨8C/C樱花树代码9C/C奥特曼代码10C/C精美圣诞树11C/C俄罗斯方块12C/C贪吃蛇13C/C孤单又灿烂的神-鬼怪14C/C闪烁的爱心15C/C…

【机器学习】——K均值聚类:揭开数据背后的隐藏结构

目录 引言:什么是聚类分析?K均值聚类的基本原理 2.1 聚类的概念2.2 K均值聚类简介 K均值算法的工作原理 3.1 初始化与选定K值3.2 计算距离与分配簇3.3 更新质心3.4 迭代与收敛 K均值聚类的优缺点 4.1 优点4.2 缺点与局限性 K均值聚类的常见应用 5.1 市场…

【WRF-Urban】SLUCM新增空间分布城市冠层参数及人为热排放AHF代码详解(下)

目录 详细解释更改文件内容4 运行模块(run):README.namelist5 输出模块(share):share/module_check_a_mundo.Fshare/output_wrf.F参考SLUCM新增空间分布城市冠层参数及人为热排放AHF代码详解的前两部分内容可参见-【WRF-Urban】SLUCM新增空间分布城市冠层参数及人为热排放A…

go 集成nacos注册中心、配置中心

使用限制 Go>v1.15 Nacos>2.x 安装 使用go get安装SDK: go get -u github.com/nacos-group/nacos-sdk-go/v2 快速使用 初始化客户端配置ClientConfig constant.ClientConfig{TimeoutMs uint64 // 请求Nacos服务端的超时时间,默…

ModelScope-Agent(1): 基于开源大语言模型的可定制Agent系统

目录 简介快速入门 简介 github地址 快速入门 看前两篇,调用千问API和天气API # 选用RolePlay 配置agent from modelscope_agent.agents.role_play import RolePlay # NOQArole_template 你扮演一个天气预报助手,你需要查询相应地区的天气&#x…

终端中运行 conda install 命令后一直显示“Solving environment: \ ”

初步接触深度学习,在配置环境方面出了点问题,运行 conda install 命令时,卡在 "Solving environment: \ "。 网上搜索发现, 一般可能的原因就是以下几种 环境解析耗时: Conda 在安装包时需要解析当前环境&…

Jenkins相关的Api接口调用详解

Jenkins API是Jenkins持续集成和持续部署(CI/CD)平台提供的一组接口,允许外部程序通过HTTP请求与Jenkins进行交互。以下是对Jenkins API使用的简介: 一、Jenkins API的主要功能 作业管理:通过API,可以创建、配置、删除以及查询作业(Job)。构建触发:可以远程触发新的构…

【模型对比】ChatGPT vs Kimi vs 文心一言那个更好用?数据详细解析,找出最适合你的AI辅助工具!

在这个人工智能迅猛发展的时代,AI聊天助手已经深入我们的工作与生活。你是否曾在选择使用ChatGPT、Kimi或是百度的文心一言时感到一头雾水?每款AI都有其独特的魅力与优势,那么,究竟哪一款AI聊天助手最适合你呢?本文将带…

react 和 react-dom 是什么关系

React和React DOM是两个与React生态系统密切相关的npm包,它们在构建用户界面时扮演不同的角色,但相互之间存在紧密的依赖关系。以下是React和React DOM关系的详细解释: React的作用 React是一个用于构建用户界面的JavaScript库。它提供了构建…

微信小程序uni-app+vue3实现局部上下拉刷新和scroll-view动态高度计算

微信小程序uni-appvue3实现局部上下拉刷新和scroll-view动态高度计算 前言 在uni-appvue3项目开发中,经常需要实现列表的局部上下拉刷新功能。由于网上相关教程较少且比较零散,本文将详细介绍如何使用scroll-view组件实现这一功能,包括动态高度计算、下拉刷新、上拉加载等完整…

Netty面试内容整理-常见问题排查与调试

在使用 Netty 进行开发时,排查和调试常见问题是确保系统稳定运行的关键部分。以下是一些 Netty 中常见的问题排查和调试的方法,以及对应的解决思路: 内存泄漏问题 问题描述:Netty 内存泄漏可能发生在 ByteBuf 没有被正确释放的情况下,导致内存逐渐被耗尽。 排查方法:Reso…

SQL——DQL分组聚合

分组聚合: 格式: select 聚合函数1(聚合的列),聚合函数2(聚合的列) from 表名 group by 标识列; ###若想方便分辨聚合后数据可在聚合函数前加上标识列(以标识列进行分组) 常见的聚合函数: sum(列名):求和函数 avg(列名)…

maven打包时出现找不到符号的错误如何解决

在maven打包的时候有时会出现找不到符号的情况,具体原因是由于引用的BaseEntity是framework模块下的实体类,所以需要将framework重新clean再install,成功后再将我们的模块打包就成功了

NumPy和Pandas之间直接相互转换

NumPy数组转换为Pandas DataFrame 要将NumPy数组转换为Pandas DataFrame,可以使用Pandas的DataFrame类的构造函数。这个过程很简单,只需要将NumPy数组作为参数传递给DataFrame构造函数即可。此外,还可以指定列名,以便在DataFrame…

openGauss开源数据库实战二十一

文章目录 任务二十一 使用JDBC访问openGauss数据库任务目标实施步骤一、准备工作 二、下载并安装JavaSE81 下载JavaSE8安装Java8SE并配置环境变量 三、下载并安装eclipse四、下载并安装openGauss的JDBC驱动包五、使用IDEA编写JDBC测试程序1 使用IDEA的SSH连接虚拟机2 创建项目并…

Git:常用命令

一、查看当前分支 git branch 二、查看所有分支 git branch -a 三、切换到远程分支 git checkout origin/分支名 示例:git checkout origin/dev 四、拉取远程分支代码 git pull origin 分支名 示例:git pull origin dev 五、常用指令 查看暂存区…

运维实战:K8s 上的 Doris 高可用集群最佳实践

今天我们将深入探讨::如何在 K8s 集群上部署 Compute storage coupled(存算耦合) 模式的 Doris 高可用集群? 本文,我将为您提供一份全面的实战指南,逐步引导您完成以下关键任务: 配…

2024.12.10总结

早上和上午,通过一个自动化测试工具对环境进行自动化测试,跑的时候出现各种问题。如何去定位问题并且解决问题,确实是一个比较关键的能力。晚上去考了测试专业级科目一,只找到了12个bug,距离通关17个以上,还…

在GITHUB上传本地文件指南(详细图文版)

这份笔记简述了如何在GITHUB上上传文件夹的详细策略。 既是对自己未来的一个参考,又希望能给各位读者带来帮助。 详细步骤 打开目标文件夹(想要上传的文件夹) 右击点击git bash打开 GitHub创立新的仓库后,点击右上方CODE绿色按…

Vue框架入门

Author:Dawn_T17?? 目录 什么是框架 一.Vue 的使用方向 二.Vue 框架的使用场景 (TIP)MVVM思想 三.Vue入门案例 TIP:插值表达式 四.Vue-指令? (1)v-bind 和 v-model? ? (2&#x…