点击上方 好好学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(*) 效率高么?相关推荐

  1. 你还在认为 count(1) 比 count(*) 效率高?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源| blog.csdn.net/iFuMI/artic ...

  2. count(1)、count(*) 与 count (列名) 的执行区别

    (给视学算法加星标,提升数据技能) 转自:BigoSprite https://blog.csdn.net/iFuMI/article/details/77920767 执行效果:  1.count( ...

  3. php sql count函数,SQL COUNT() 函数

    SQL COUNT() 函数 COUNT() 函数返回匹配指定条件的行数. SQL COUNT(column_name) 语法 COUNT(column_name) 函数返回指定列的值的数目(NULL ...

  4. Oracle 中count(1) 和count(*) 的区别

    count(1)与count(*)比较: 如果你的数据表没有主键,那么count(1)比count(*)快 如果有主键的话,那主键(联合主键)作为count的条件也比count(*)要快 如果你的表只 ...

  5. 关于数据库优化1——关于count(1),count(*),和count(列名)的区别,和关于表中字段顺序的问题...

    1.关于count(1),count(*),和count(列名)的区别 相信大家总是在工作中,或者是学习中对于count()的到底怎么用更快.一直有很大的疑问,有的人说count(*)更快,也有的人说 ...

  6. mysql 求count和_MySQL的统计总数count(*)与count(id)或count(字段)的之间的各自效率性能对比...

    执行效果: 1.  count(1) and count(*) 当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了! 从执行计划来看,count(1)和coun ...

  7. select count(*)和select count(1)的区别(转载)

    效果:两者的返回结果是一样的. 意义:当count的参数是具体值时(如count(1),count('a')),count的参数已没有实际意义了. 范围:在统计范围,count(*)和count(1) ...

  8. 一直认为 count(1) 比 count(*) 效果高,被同事鄙视了。

    今日推荐 腾讯二面:@Bean 与 @Component 用在同一个类上,会怎么样?比 Xshell 还好用的 SSH 客户端神器,MobaXterm 太爱了!SpringBoot 如何统计.监控 S ...

  9. 执行COUNT(1)、COUNT(*) 与 COUNT(列名) 到底有什么区别?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:干掉 Navicat:这个 IDEA 的兄弟真香!个人原创100W+访问量博客:点击前往,查看更多 来源:blo ...

最新文章

  1. win10 mbr下装linux,在Win10下安装Ubuntu 18.04双系统(MBR+Legacy)
  2. 用AI实现C++、Java、Python代码互译,运行成功率最高达80.9%
  3. C语言不用strcmp函数比较字符串大小
  4. 独家 | 几个Jupyter笔记本的使用技巧
  5. Flutter事件与手势识别
  6. 强化学习(六)时序差分在线控制算法SARSA
  7. iOS 修改UITabBar的默认点击行为
  8. Angular的HttpClient注入
  9. JavaScript开发的技巧
  10. debug error怎么解决_我要以血和泪的经历告诉你,这个 bug 太难解决了
  11. 三星电子通信撤出中国!
  12. golang web开发获取get、post、cookie参数
  13. 一些Euclid空间上的定义
  14. Filter的敏感词汇过滤案例
  15. 【数学建模】随机抽样的三种方法(简单随机抽样、分层抽样、系统抽样),自定义封装函数直接调用
  16. c语言绝对值函数作用,C语言实现abs和fabs绝对值
  17. ddos应急处理_DDoS攻击应急体系知多少?
  18. Chrome和Chromium的区别
  19. MySQL原理与实践(一):一条select语句引出Server层和存储引擎层
  20. 信息二处的面上项目252项

热门文章

  1. paho mqtt 在某平台sdk应用上发送数据定时器超时问题
  2. 全志代码中的bug之2
  3. 逻辑分析仪抓取波形参数设置
  4. 微众WeCross 跨链平台(3)交易流程
  5. 基于区块链的健康链系统设计与实现(6)结束语
  6. 关于 pip install mysqlclent安装失败 ERROR: No matching distribution found for mysqlclient 的解决方案
  7. 公钥密码学标准(Public Key Cryptography Standards, PKCS)
  8. Sphinx文档的展示-个人学习笔记
  9. Vue+ElemtUI中对el-dialog弹出框宽度调整方法
  10. 自用 x86 GetProcAddress + GetModuleHandle