COUNT(1)\COUNT(*)\COUNT(列名)到底谁更快

今天来研究一个比较有趣的话题,关于我们平常使用mysql查询数量的到底那种方式查询效率更高的问题

起因

这个问题在我以前的认知里是,按效率从高到低品排序 count(1)>count(列名)>count(*),但是我也注意到过mybatis-plus官方提供的selectCount方法和分页查询时,它的SQL在查询时默认使用的是count(*)其实我对这个问题是一直不解的,我认为mybatis-plus应该不会采取一种效率更低的方式来实现,所以有时间懒研究一下这个问题

现实排名

在性能方面COUNT(*)是约等于COUNT(1)的,COUNT(列名)略低于前两种

原因

关于COUNT函数,在MySQL官网中有详细介绍:

翻译过来就是:COUNT(expr) ,返回SELECT语句检索的行中expr的值不为NULL的数量。结果是一个BIGINT值。如果查询结果没有命中任何记录,则返回0, 但是COUNT(*) 的统计结果中,会包含值为NULL的行数。

MySQL官方对COUNT(*)的优化

COUNT(*)是SQL92定义的标准统计行数的语法,所以MySQL数据库对他进行过很多优化。

MySQL中比较常用的执行引擎就是InnoDB和MyISAM。MyISAM和InnoDB有很多区别,其中有一个关键的区别和我们接下来要介绍的COUNT(*)有关,那就是MyISAM不支持事务,MyISAM中的锁是表级锁;而InnoDB支持事务,并且支持行级锁。
1.因为MyISAM的锁是表级锁,所以同一张表上面的操作需要串行进行,所以,MyISAM做了一个简单的优化,那就是它可以把表的总行数单独记录下来,如果从一张表中使用COUNT(*)进行查询的时候,可以直接返回这个记录下来的数值就可以了,当然,前提是不能有where条件。

MyISAM之所以可以把表中的总行数记录下来供COUNT(*)查询使用,那是因为MyISAM数据库是表级锁,不会有并发的数据库行数修改,所以查询得到的行数是准确的。但是,对于InnoDB来说,就不能做这种缓存操作了,因为InnoDB支持事务,其中大部分操作都是行级锁,所以可能表的行数可能会被并发修改,那么缓存记录下来的总行数就不准确了。
但是,InnoDB还是针对COUNT(*)语句做了些优化的。

在InnoDB中,使用COUNT(*)查询行数的时候,不可避免的要进行扫表了,那么,就可以在扫表过程中下功夫来优化效率了。
从MySQL 8.0.13开始,针对InnoDB的SELECT COUNT(*) FROM tbl_name语句,确实在扫表的过程中做了一些优化。前提是查询语句中不包含WHERE或GROUP BY等条件。我们知道,COUNT(*)的目的只是为了统计总行数,所以,他根本不关心自己查到的具体值,所以,他如果能够在扫表的过程中,选择一个成本较低的索引进行的话,那就可以大大节省时间。我们知道,InnoDB中索引分为聚簇索引(主键索引)和非聚簇索引(非主键索引),聚簇索引的叶子节点保存的是整行记录,而非聚簇索引的叶子节点中保存的是该行记录的主键的值。

所以,相比之下,非聚簇索引要比聚簇索引小很多,所以MySQL会优先选择最小的非聚簇索引来扫表。所以,当我们建表的时候,除了主键索引以外,创建一个非主键索引还是有必要的。

结论,MySQL数据库对于COUNT(*)的优化,这些优化的前提都是查询语句中不包含WHERE以及GROUP BY条件。


COUNT(1)与COUNT(*)对比

这个官方文档也有提到

对于COUNT(1)和COUNT(*),MySQL的优化是完全一样的,根本不存在谁比谁快!

建议使用COUNT(*)!因为这个是SQL92定义的标准统计行数的语法

COUNT(字段)

他的查询就比较简单粗暴了,就是进行全表扫描,然后判断指定字段的值是不是为NULL,不为NULL则累加。相比COUNT(*),COUNT(字段)多了一个步骤就是判断所查询的字段是否为NULL,所以他的性能要比COUNT(*)慢。

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

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

相关文章

第五十三节 Java设计模式 - 工厂模式

Java设计模式 - 工厂模式 工厂模式是一种创建模式,因为此模式提供了更好的方法来创建对象。 在工厂模式中,我们创建对象而不将创建逻辑暴露给客户端。 例子 在以下部分中,我们将展示如何使用工厂模式创建对象。 由工厂模式创建的对象将是…

监控公司局域网电脑的软件|局域网电脑监控软件哪个好用

想要监控公司局域网电脑?没问题,市面上有一大堆选择等着你!每个软件都有它的独门绝技和适用场合,接下来就让我带你看看哪些软件既好用又功能强大吧! 🎉OpManager: 这位大佬适合中大型企业&#…

每日算法-java

题目来自蓝桥云 // 这是一个Java程序,用于解决最长不下降子序列问题。 // 问题描述:给定一个整数序列,找到最长的子序列,使得这个子序列是不下降的(即相邻的元素不严格递减)。 // 程序使用了动态规划的方法…

STM32编译前置条件配置

本文基于stm32f104系列芯片,记录编程代码前需要的操作: 添加库文件 在ST官网下载标准库STM32F10x_StdPeriph_Lib_V3.5.0,解压后,得到以下界面 启动文件 进入Libraries,然后进入CMSIS,再进入CM3&#xff…

这些接口测试工具你一定要知道

接口测试工具 接口测试工具如图: 1.Fiddler 首先,这是一个HTTP协议调试代理工具,说白了就是一个抓http包的工具。web测试和手机测试都能用到这个工具。既然是http协议,这个工具也能支持接口测试。 2.PostMan Postman一款非常流行…

视频号怎么做有收益,上传短视频怎么挣钱

比如说抖音有中视频流量收益,B站有创作激励计划流量收益,如今在微信端不仅有公众号流量主收益, 现在视频号还推出了创造分成流量收益! 对于我们普通人来说无异于又一个机会,能不能抓得住就看你能不看懂本Sir今天的这…

JDK 17有可能代替 JDK 8 吗

不好说,去 Oracle 化是很多公司逐步推进的政策。 JVM 有 OpenJ9。很多公司可能会用 IBM 的版本。 JDK 这东西,能用就不会升级。 JDK 太基础了,决定了后面的很多 jar 的版本。 https://www.ossez.com/t/jdk-17-jdk-8/14102

通过Matlab实现Hermite基函数进行信号拟合,可应用于信号降噪

利用Hermite基函数的Hermite近似,在不牺牲精度的情况下,实现对时序信号的降噪,文中图片以心电信号QRS波群滤除高频干扰为例。 1.知识背景 Hermite正交多项式是一类重要的正交多项式,它们起源于数学中的Hermite函数和特殊函数理论…

第28章-PPPoE

1. 以太网接入的典型应用 1.1. IP技术的应用与发展 1.2. 以太网接入的典型应用场景之一——大型园区接入的典型应用 2. PPPoE技术的基本原理 2.1. 技术背景 2.2. PPPoE工作原理 2.3. PPPoE的两个阶段:Discovery阶段和PPPSession阶段 2.4. PPPoE的帧结构 2.5. PPPoE…

【精品毕设推荐】搜索引擎的设计与实现

点击免费下载原文及代码 摘要 我们处在一个大数据的时代,伴随着网络信息资源的庞大,人们越来越多地注重怎样才能快速有效地从海量的网络信息中,检索出自己需要的、潜在的、有价值的信息,从而可以有效地在日常工作和生活中发挥作…

【NI 国产替代】cDAQ-9178, 8槽USB CompactDAQ机箱,国产数据采集卡控制器进口替代方案

8槽USB CompactDAQ机箱 cDAQ-9178是专为小型便携式传感器测量系统而设计的总线供电CompactDAQ USB机箱。机箱通过即插即用的USB可轻松连接传感器和电气测量。该机箱还可控制C系列I/O模块与外部主机之间的定时、同步和数据传输。机箱可以搭配不同的C系列I/O模块组合&#xff0c…

【C++】cin输入和cout输出

cin和cout简介 cin可以从键盘中读取数据,cout可以把数据打印到显示器上,cout配合endl可以打印换行符。cin、cout和endl是在iostream头文件内声明的,使用时必须#include包含iostream头文件。cin、cout和endl都在命名空间std里,参考…

区块链交易所开发

在当今数字化时代,区块链技术以其独特的去中心化、安全性和透明性,正在逐步改变我们的生活。其中,区块链交易所作为连接区块链技术与广大投资者的桥梁,其开发与发展备受关注。本文将从技术进步与市场需求两个维度,探讨…

抖音小店达人佣金应该怎么结算呢?给达人设置多少佣金合适?

大家好,我是电商小V 咱们在运营抖音小店的时候一定会遇到被达人催促结算佣金的情况,咱们给达人合作的时候都会遇到过新手达人,就是给咱们直播带货之后催促咱们赶紧结算商品的佣金, 但是咱们都需要知道一点,那就是小店的…

VTK —— 三、简单操作 - 示例2 - 计算从3D点到直线的距离(附完整源码)

代码效果 本代码编译运行均在如下链接文章生成的库执行成功,若无VTK库则请先参考如下链接编译vtk源码: VTK —— 一、Windows10下编译VTK源码,并用Vs2017代码测试(附编译流程、附编译好的库、vtk测试源码) 教程描述 本…

跟TED演讲学英文:How to govern AI — even if it‘s hard to predict by Helen Toner

How to govern AI — even if it’s hard to predict Link: https://www.ted.com/talks/helen_toner_how_to_govern_ai_even_if_it_s_hard_to_predict? Speaker: Helen Toner Date: April 2024 文章目录 How to govern AI — even if its hard to predictIntroductionVocabu…

Hadamard Product(点乘)、Matmul Product(矩阵相乘)和Concat Operation(拼接操作)在神经网络中的应用

Hadamard乘积(Hadamard Product),矩阵乘法(Matmul Product)和拼接操作(Concatenation Operation)在神经网络中的使用情况如下: Hadamard Product点乘、内积: Hadamard乘…

编程入门(六)【Linux系统基础操作一】

读者大大们好呀!!!☀️☀️☀️ 🔥 欢迎来到我的博客 👀期待大大的关注哦❗️❗️❗️ 🚀欢迎收看我的主页文章➡️寻至善的主页 文章目录 🔥前言🚀Linux操作系统介绍与环境准备Linux操作系统介…

Kafka源码分析(五) - Server端 - 基于时间轮的延时组件

系列文章目录 Kafka源码分析-目录 一. 背景 Kafka内部涉及大量的"延时"操作,比如收到PRODUCE请求后可为副本等待一个timeout的时间后再响应客户端。 那我们讨论一个问题:Kafka为什么自己实现了一个延时任务组件,而不直接使用ja…

《从Paxos到Zookeeper》——第五、六章:经典应用场景

目录 第五章 使用Zookeeper 5.1 服务端部署与运行 5.2 客户端相关 5.2.1 客户端运行 5.2.2 客户端命令 5.3 Java客户端API 5.4 开源客户端 第六章 经典应用场景 6.1 典型应用场景及实现 6.1.1 数据发布/订阅(全局配置中心) 6.1.2 负载均衡(Lo…
最新文章