加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

你是一向以为count(1) 比count(*) 服从高么?

发布时间:2019-07-07 21:40:08 所属栏目:编程 来源:码匠笔记
导读:MySQL count(1) 真的比 count(*) 快么? 横竖同事们都是这么说的,我也暂时认为对吧,那么没有本身研究一下毕竟?假如我汇报你他们一样,你信么? 有 Where 前提的 count,会按照扫码功效count 一下全部的行数,其机能更依靠于你的 Where 前提,以是文章我们

你是一向以为count(1) 比count(*) 服从高么?

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 不是本文的重点,有乐趣可以一连存眷订阅号或置顶,后头会针对这些要害字一一睁开声名。

【编辑保举】

  1. MySQL单表数据量高出2000万机能急剧降落的说法靠谱?
  2. 不容错过的MySQL和MariaDB七项成果
  3. Gitlab 从 12.1 版本开始将不再支持 MySQL !
  4. MySQL在大型网站的应用架构演变
  5. 用Pandas库实现MySQL数据库的读写
【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读