今日推荐

腾讯二面:@Bean 与 @Component 用在同一个类上,会怎么样?比 Xshell 还好用的 SSH 客户端神器,MobaXterm 太爱了!SpringBoot 如何统计、监控 SQL运行情况?SpringBoot 那些自带 Buff 的工具类,你用过几个?最新 955 不加班的公司名单(2022版)字节跳动P0级事故:实习生删除GB以下所有模型,直接上了今日头条......

MySQL count(1) 真的比 count(*) 快么?

你也一直和我一样认为 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 不是本文的重点,有兴趣可以持续关注订阅号或置顶,后面会针对这些关键字逐一展开说明。

最后,再给大家推荐一个GitHub项目,该项目整理了上千本常用技术PDF,技术书籍都可以在这里找到。

GitHub地址:https://github.com/hello-go-maker/cs-books

电子书已经更新好了,拿走不谢,记得点一个star,持续更新中...

一直认为 count(1) 比 count(*) 效果高,被同事鄙视了。相关推荐

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

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

  2. 你是一直认为 count(1) 比 count(*) 效率高么?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:收藏了!7 个开源的 Spring Boot 前后端分离优质项目个人原创+1博客:点击前往,查看更多 本文出自: ...

  3. 别傻了,你还认为 count(1) 比 count(*) 效率高?

    来源| blog.csdn.net/iFuMI/article/details/77920767 1. count(1) and count(*) 当表的数据量大些时,对表作分析之后,使用count( ...

  4. count返回0_你是一直认为 count(1) 比 count(*) 效率高么?

    MySQL count(1) 真的比 count(*) 快么? 反正同事们都是这么说的,我也姑且觉得对吧,那么没有自己研究一下究竟?如果我告诉你他们一样,你信么? 有 Where 条件的 count, ...

  5. 你是一直认为count(1)比count(*)效率高么?

    MySQL count(1) 真的比 count(*) 快么? 反正同事们都是这么说的,我也姑且觉得对吧,那么没有自己研究一下究竟?如果我告诉你他们一样,你信么? 有 Where 条件的 count, ...

  6. count是java关键字吗_你是一直认为 count(1) 比 count(*) 效率高么?

    点击上方"后端技术精选",选择"置顶公众号" 技术文章第一时间送达! 本文出自:码匠笔记 MySQL count(1) 真的比 count(*) 快么? 反正同 ...

  7. mysql count优化_MySQL count()函数及其优化

    很简单,就是为了统计记录数 由SELECT返回 为了理解这个函数,让我们祭出 employee_tbl 表 所有记录 统计行的总数 计算 Zara 的记录数 注意:由于 SQL 查询对大小写不敏感,所 ...

  8. count(*) count(1)与count(字段)的区别

    话不多说 MySql官方文档聚合函数地址 首先count函数的简单介绍: 上翻译: 1.COUNT(expr) ,返回SELECT语句检索的行中expr的值不为NULL的数量.结果是一个BIGINT值 ...

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

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

最新文章

  1. Oracle分组后对分组内容重复 取第一个
  2. C++ OpenGL透明纹理源码
  3. 【Linux】一步一步学Linux——ntsysv命令(149)
  4. 用Apache构建WEB服务器
  5. C语言实现x的n次方
  6. powershell 停止正在运行的用户应用
  7. 深圳市南山区派出所地址和电话列表
  8. [细说Java](3)创建字符串是使用quot; quot;还是构造函数?
  9. TikTok最适合普通小白的赚钱方法?
  10. asp.net中用后台代码创建datatable和html表格,ASP.NET中用后台代码创建DataTable和HTML表格...
  11. python登录验证_Python第一天-----简单登录验证
  12. 系统软件设计和性能的几个要点
  13. 《圣经》放射光明,金钱散发温暖
  14. Python3使用代理爬取某网文献摘要(完整源码)
  15. Python进阶——循环对象
  16. html5 css3在线工具,HTML5/CSS3开发辅助工具(TopStyle)
  17. sql升序null排在顶部
  18. 淘宝直播接口分析!!! 测试!!!
  19. Win10 开始菜单丢失部分菜单项和部分应用快捷方式
  20. 东南大学计算机专硕录取分数线,东南大学研究生录取分数线

热门文章

  1. MSSQL 2005 DML触发器
  2. Ubuntu设置静态IP,解决重启后需要重新设置的问题。
  3. c语言中%hu,%hx是什么意思
  4. globalmem设备代码分析
  5. C++ Primer 5th笔记(chap 16 模板和泛型编程)转发
  6. Bech32编码 (3)隔离见证地址
  7. PKI/CA (6)双证书
  8. Html 教程 (6)script标签
  9. [How TO]-Ubuntu 20.04修改终端标题栏文字
  10. [BSidesSF2020]haystack