内容简介:优质文章,第一时间送达
点击上方 蓝色字体 ,选择“设置星标”
优质文章,第一时间送达
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 不是本文的重点,有兴趣可以持续关注订阅号或置顶,后面会针对这些关键字逐一展开说明。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 开发人员认为Python最适合AI的原因
- 关于中台,聊聊我认为相对客观的三点认知
- 微软工程师认为 Mozilla 也应该拥抱 Chromium
- 你也认为技术总监应懂技术细节,有些可悲
- 为什么我认为使用 blender 一定会用到 Python
- Haskell程序中止与“循环”,但我认为它不应该
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
数据结构与算法分析
韦斯(Mark Allen Weiss) / 机械工业出版社 / 2010-8 / 45.00元
《数据结构与算法分析:C语言描述》曾被评为20世纪顶尖的30部计算机著作之一,作者在数据结构和算法分析方面卓有建树,他的数据结构和算法分析的著作尤其畅销,并受到广泛好评,已被世界500余所大学选作教材。 在《数据结构与算法分析:C语言描述》中,作者精炼并强化了他对算法和数据结构方面创新的处理方法。通过C程序的实现,着重阐述了抽象数据类型的概念,并对算法的效率、性能和运行时间进行了分析。 ......一起来看看 《数据结构与算法分析》 这本书的介绍吧!