你是一直认为 count(1) 比 count(*) 效率高么?
点击上方 好好学java ,选择 星标 公众号
重磅资讯、干货,第一时间送达
今日推荐:收藏了!7 个开源的 Spring Boot 前后端分离优质项目个人原创+1博客:点击前往,查看更多
本文出自:码匠笔记
MySQL count(1) 真的比 count(*) 快么? 反正同事们都是这么说的,我也姑且觉得对吧,那么没有自己研究一下究竟?如果我告诉你他们一样,你信么?
有 Where
条件的 count
,会根据扫码结果count
一下所有的行数,其性能更依赖于你的 Where
条件,所以文章我们仅针对没有 Where
的情况进行说明。
MyISAM 引擎会把一个表的总行数记录了下来,所以在执行 count(*)
的时候会直接返回数量,执行效率很高。在 MySQL 5.5 以后默认引擎切换为 InnoDB,InnoDB 因为增加了版本控制(MVCC)的原因,同时有多个事务访问数据并且有更新操作的时候,每个事务需要维护自己的可见性,那么每个事务查询到的行数也是不同的,所以不能缓存具体的行数,他每次都需要 count
一下所有的行数。那么 count(1)
和 count(*)
有区别么?
InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.
这是官网的解释,直接点击阅读原文
查看官文,所以两种实现其实一样,那么具体为什么一样呢?
探究这个问题首先我们需要理解 count
的含义,如下是官网给出的定义
Returns a count of the number of non-NULL values of expr in the rows retrieved by a SELECT statement. The result is a BIGINT value.
大致的解释是返回 SELECT 语句检索的行中 expr 的非 NULL 值的计数,到这里我们就明白了,首先它是一个聚合函数,然后对 SELECT 的结果集进行计数,但是需要参数不为 NULL。那么我们继续阅读官网的内容:
COUNT(*) is somewhat different in that it returns a count of the number of rows retrieved, whether or not they contain NULL values.
大致的内容是说,count(*) 不同,他不关心这个返回值是否为空都会计算他的count,因为 count(1) 中的 1 是恒真表达式,那么 count(*) 还是 count(1) 都是对所有的结果集进行 count,所以他们本质上没有什么区别。
当然这个地方 InnoDB 本身也做了一些优化,它会使用最小的二级索引来进行 count
的查询优化。如果没有二级索引才会选择聚簇索引,这样的设计单从 IO 的角度就节省了很多开销。
到这里我们明白了 count(*) 和 count(1) 本质上面其实是一样的,那么 count(column) 又是怎么回事呢?
count(column) 也是会遍历整张表,但是不同的是它会拿到 column 的值以后判断是否为空,然后再进行累加,那么如果针对主键需要解析内容,如果是二级所以需要再次根据主键获取内容,又是一次 IO 操作,所以 count(column) 的性能肯定不如前两者喽,如果按照效率比较的话:count(*)=count(1)>count(primary key)>count(column)
既然 count(*) 在查询上依赖于所有的数据集,是不是我们在设计上也需要尽量的规避全量 count 呢?通常情况我们针对可预见的 count 查询会做适当的缓存,可以是 Redis,也可以是独立的 MySQL count 表,当然无论是哪种方式我们都需要考虑一致性的问题。
到这里文章就结束了,你对 count() 有了重新的认识么?文中提到了一些关键字:聚簇索引、InnoDB、MyISAM、MVCC 不是本文的重点,有兴趣可以持续关注订阅号或置顶,后面会针对这些关键字逐一展开说明。
你是一直认为 count(1) 比 count(*) 效率高么?相关推荐
- 你还在认为 count(1) 比 count(*) 效率高?
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源| blog.csdn.net/iFuMI/artic ...
- count(1)、count(*) 与 count (列名) 的执行区别
(给视学算法加星标,提升数据技能) 转自:BigoSprite https://blog.csdn.net/iFuMI/article/details/77920767 执行效果: 1.count( ...
- php sql count函数,SQL COUNT() 函数
SQL COUNT() 函数 COUNT() 函数返回匹配指定条件的行数. SQL COUNT(column_name) 语法 COUNT(column_name) 函数返回指定列的值的数目(NULL ...
- Oracle 中count(1) 和count(*) 的区别
count(1)与count(*)比较: 如果你的数据表没有主键,那么count(1)比count(*)快 如果有主键的话,那主键(联合主键)作为count的条件也比count(*)要快 如果你的表只 ...
- 关于数据库优化1——关于count(1),count(*),和count(列名)的区别,和关于表中字段顺序的问题...
1.关于count(1),count(*),和count(列名)的区别 相信大家总是在工作中,或者是学习中对于count()的到底怎么用更快.一直有很大的疑问,有的人说count(*)更快,也有的人说 ...
- mysql 求count和_MySQL的统计总数count(*)与count(id)或count(字段)的之间的各自效率性能对比...
执行效果: 1. count(1) and count(*) 当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了! 从执行计划来看,count(1)和coun ...
- select count(*)和select count(1)的区别(转载)
效果:两者的返回结果是一样的. 意义:当count的参数是具体值时(如count(1),count('a')),count的参数已没有实际意义了. 范围:在统计范围,count(*)和count(1) ...
- 一直认为 count(1) 比 count(*) 效果高,被同事鄙视了。
今日推荐 腾讯二面:@Bean 与 @Component 用在同一个类上,会怎么样?比 Xshell 还好用的 SSH 客户端神器,MobaXterm 太爱了!SpringBoot 如何统计.监控 S ...
- 执行COUNT(1)、COUNT(*) 与 COUNT(列名) 到底有什么区别?
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:干掉 Navicat:这个 IDEA 的兄弟真香!个人原创100W+访问量博客:点击前往,查看更多 来源:blo ...
最新文章
- win10 mbr下装linux,在Win10下安装Ubuntu 18.04双系统(MBR+Legacy)
- 用AI实现C++、Java、Python代码互译,运行成功率最高达80.9%
- C语言不用strcmp函数比较字符串大小
- 独家 | 几个Jupyter笔记本的使用技巧
- Flutter事件与手势识别
- 强化学习(六)时序差分在线控制算法SARSA
- iOS 修改UITabBar的默认点击行为
- Angular的HttpClient注入
- JavaScript开发的技巧
- debug error怎么解决_我要以血和泪的经历告诉你,这个 bug 太难解决了
- 三星电子通信撤出中国!
- golang web开发获取get、post、cookie参数
- 一些Euclid空间上的定义
- Filter的敏感词汇过滤案例
- 【数学建模】随机抽样的三种方法(简单随机抽样、分层抽样、系统抽样),自定义封装函数直接调用
- c语言绝对值函数作用,C语言实现abs和fabs绝对值
- ddos应急处理_DDoS攻击应急体系知多少?
- Chrome和Chromium的区别
- MySQL原理与实践(一):一条select语句引出Server层和存储引擎层
- 信息二处的面上项目252项
热门文章
- paho mqtt 在某平台sdk应用上发送数据定时器超时问题
- 全志代码中的bug之2
- 逻辑分析仪抓取波形参数设置
- 微众WeCross 跨链平台(3)交易流程
- 基于区块链的健康链系统设计与实现(6)结束语
- 关于 pip install mysqlclent安装失败 ERROR: No matching distribution found for mysqlclient 的解决方案
- 公钥密码学标准(Public Key Cryptography Standards, PKCS)
- Sphinx文档的展示-个人学习笔记
- Vue+ElemtUI中对el-dialog弹出框宽度调整方法
- 自用 x86 GetProcAddress + GetModuleHandle