你是一直认为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 不是本文的重点,有乐趣可以一连存眷订阅号或置顶,后头会针对这些要害字一一睁开声名。 【编辑保举】
点赞 0 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |