广告
返回顶部
首页 > 资讯 > 数据库 >MySQL中的count(*)和count(1)哪个更快
  • 390
分享到

MySQL中的count(*)和count(1)哪个更快

2024-04-02 19:04:59 390人浏览 八月长安
摘要

这篇文章主要讲解了“Mysql中的count(*)和count(1)哪个更快”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql中的count(*)和c

这篇文章主要讲解了“Mysql中的count(*)和count(1)哪个更快”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql中的count(*)和count(1)哪个更快”吧!

MySQL中的count(*)和count(1)哪个更快

声明:以下讨论基于 InnoDB 存储引擎,MyISAM 因为情况特殊我在文末会单独说一下。

先说结论:这两个性能差别不大。

1.实践

我准备了一张有 100W 条数据的表,表结构如下:

CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(255) DEFAULT NULL,
  `address` varchar(255) DEFAULT NULL,
  `passWord` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

可以看到,有一个主键索引

我们来用两种方式统计一下表中的记录数,如下:

MySQL中的count(*)和count(1)哪个更快

可以看到,两条 sql 的执行效率其实差不多,都是 0.14s。

再来看另外两个统计:

MySQL中的count(*)和count(1)哪个更快

id 是主键,username 以及 address 则是普通字段。

可以看出,用 id 来统计,也有一丢丢优势。松哥这里因为测试数据样板比较小,所以效果不明显,小伙伴们可以加大测试数据量,那么这种差异会更加明显。

那么到底是什么原因造成的这种差异,接下来我们就来简单分析一下。

2. explain 分析

我们先用 explain 来看下这几个 SQL 不同的执行计划:

MySQL中的count(*)和count(1)哪个更快

可以看到,前三个统计方式的执行计划是一样的,后面两个是一样的。

我这里和大家比较下 explain 中的不同项:

  • type:前三个的 type 值为 index,表示全索引扫描,就是把整个索引过一遍就行(注意是索引不是整个表);后两个的 type 值为 all,表示全表扫描,即不会使用索引。

  • key:这个表示 MySQL 决定采用哪个索引来优化对该表的访问,PRIMARY 表示利用主键索引,NULL 表示不用索引。

  • key_len:这个表示 MySQL 使用的键长度,因为我们的主键类型是 INT 且非空,所以值为 4。

  • Extra:这个中的 Using index 表示优化器只需要通过访问索引就可以获取到需要的数据(不需要回表)。

通过 explain 我们其实也能大概看出来前三种统计方式的执行效率是要高一些的(因为用到了索引),而后面两种的统计效率相对来说要低一些的(没用索引,需要全表扫描)。

仅有上面的分析还不够,我们再来从原理角度来分析一下。

3. 原理分析

3.1 主键索引与普通索引

在开始原理分析以前,我想先带领大家看一下 B+ 树,这对于我们理解接下来的内容有重要作用。

大家都知道,InnoDB 中索引的存储结构都是 B+ 树(至于什么是 B+ 树,和 B 树有什么区别,这个本文就不讨论了,这两个单独都能整出来一篇文章),主键索引和普通索引的存储又有所不同,如下图表示主键索引:

MySQL中的count(*)和count(1)哪个更快

可以看到,在主键索引中,叶子结点保存了每一行的数据。

而在普通索引中,叶子结点保存的是主键值,当我们使用普通索引去搜索数据的时候,先在叶子结点中找到主键,再拿着主键去主键索引中查找数据,相当于做了两次查找,这也就是我们平常所说的回表操作。

3.2 原理分析

不知道小伙伴们有没有注意过,我们学习 MySQL 的时候,count 函数是归在聚合函数那一类的,就是 avg、sum 等,count 函数和这些归在一起,说明它也是一个聚合函数。

既然是聚合函数,那么就需要对返回的结果集进行一行行的判断,这里就涉及到一个问题,返回的结果是啥?我们分别来看:

对于 select count(1) from user; 这个查询来说,InnoDB 引擎会去找到一个最小的索引树去遍历(不一定是主键索引),但是不会读取数据,而是读到一个叶子节点,就返回 1,最后将结果累加。

对于 select count(id) from user;  这个查询来说,InnoDB 引擎会遍历整个主键索引,然后读取 id 并返回,不过因为 id 是主键,就在 B+ 树的叶子节点上,所以这个过程不会涉及到随机 io(并不需要回表等操作去数据页拿数据),性能也是 OK 的。

对于 select count(username) from user;  这个查询来说,InnoDB 引擎会遍历整张表做全表扫描,读取每一行的 username 字段并返回,如果 username 在定义时候设置了 not null,那么直接统计 username 的个数;如果 username 在定义的时候没有设置 not null,那么就先判断一下 username 是否为空,然后再统计。

最后再来说说 select count(*) from user; ,这个 SQL 的特殊之处在于它被 MySQL 优化过,当 MySQL 看到 count(*) 就知道你是想统计总记录数,就会去找到一个最小的索引树去遍历,然后统计记录数。

因为主键索引(聚集索引)的叶子节点是数据,而普通索引的叶子节点则是主键值,所以普通索引的索引树要小一些。然而在上文的案例中,我们只有主键索引,所以最终使用的就是主键索引。

现在,如果我修改上面的表,为 username 字段也添加索引,然后我们再来看 explain select count(*) from user; 的执行计划:

MySQL中的count(*)和count(1)哪个更快

可以看到,此时使用的索引就是 username 索引了,和我们前面的分析结果是一致的。

从上面的描述中我们就可以看出,第一个查询性能最高,第二个次之(因为需要读取 id 并返回),第三个最差(因为需要全表扫描),第四个的查询性能则接近第一个。

4. MyISAM 呢?

可能有小伙伴知道,MyISAM 引擎中的 select count(*) from user; 操作执行起来是非常快的,那是因为 MyISAM 把表中的行数直接存在磁盘中了,需要的时候直接读取出来就行了,所以非常快。

MyISAM 引擎之所以这样做,主要是因为它是不支持事务的,所以它的统计实际上就非常容易,添加一行记录一行就行了。

而我们常用的 InnoDB 却不能这样做!为啥?因为 InnoDB 支持事务!为了支持事务,InnoDB 引入了 mvcC 多版本并发控制,所以在数据读取的时候可能会有脏读、幻读以及不可重复读等问题,

感谢各位的阅读,以上就是“MySQL中的count(*)和count(1)哪个更快”的内容了,经过本文的学习后,相信大家对MySQL中的count(*)和count(1)哪个更快这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中的count(*)和count(1)哪个更快

本文链接: https://www.lsjlt.com/news/70145.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL中的count(*)和count(1)哪个更快
    这篇文章主要讲解了“MySQL中的count(*)和count(1)哪个更快”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL中的count(*)和c...
    99+
    2022-10-19
  • mysql中的count(1)、count(*)、count(id)哪个更快?
    今天和大家聊一下mysql中的count()方法 我们日常开发中,经常会用到count()命令,有的人用count(*),有的人用count(1),还有的人用count(id),那么这几种写法都有什么...
    99+
    2023-10-22
    mysql 数据库
  • Oracle里count(1)、count(*)和count(主键)哪个更快
    这两天听了将近20场演讲,感觉收获很多,最深的感觉就是自己还有很长的路要走。有几个点记录一下:昨天听老猫讲,提到一个普遍的问题就是Oracle里count(*)、count(1)和count(主键)到底哪个...
    99+
    2022-10-18
  • MySQL中的count(*)与count(1)哪个效率快
    这篇文章主要介绍了MySQL中的count(*)与count(1)哪个效率快,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。先说结论:这两个性能差别不大。1.实践我准备了一张有...
    99+
    2023-06-29
  • MySQL 中的count(*) 与 count(1) 谁更快一些?
    目录1.实践2. explain 分析3. 原理分析3.1 主键索引与普通索引3.2 原理分析4. MyISAM 呢?先说结论:这两个性能差别不大。 1.实践 我准备了一张有 100...
    99+
    2022-11-13
  • MySQL中count(1)、count(*)、count(字段)的区别有哪些
    这篇文章主要为大家展示了“MySQL中count(1)、count(*)、count(字段)的区别有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL中count(1)、count(*...
    99+
    2023-06-22
  • MySQL中count(*)、count(1)、count(col)的区别是什么
    这篇文章给大家分享的是有关MySQL中count(*)、count(1)、count(col)的区别是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。count 作用COUNT(expression):返回查询...
    99+
    2023-06-29
  • Mysql中count(*)、count(1)、count(主键id)与count(字段)的区别
    目录count()函数count(*)、count(1) 、count(主键id) 和 count(字段) 区别count(主键id) 与 count(1)count(字段)count(非空字段)count(可空字段)c...
    99+
    2022-07-29
    Mysqlcount(*)count(1)count(主键id)count(字段)
  • mysql中count( *)、count( 1)、count( 主键)、count( 字段)的区别说什么
    小编给大家分享一下mysql中count( *)、count( 1)、count( 主键)、count( 字段)的区别说什么,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!  select ...
    99+
    2022-10-19
  • MySQL中count(*)、count(1)、count(col)三者的区别是什么
    MySQL中count(*)、count(1)、count(col)三者的区别是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、表结...
    99+
    2022-10-18
  • MySQL中count()和count(1)有何区别以及哪个性能最好详解
    目录前言哪种 count 性能最好?为什么要通过遍历的方式来计数?如何优化 count(*)?*第一种,近似值*第二种,额外表保存计数值总结前言 当我们对一张数据表中的记录进行统计的...
    99+
    2022-11-13
    mysql中count()和count(1)区别mysql count(*)和count(1) mysql的count(1)
  • MySQL中的count()、union()和group by语句的用法
    本篇内容介绍了“MySQL中的count()、union()和group by语句的用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情...
    99+
    2022-10-18
  • PHP中switch和ifelse哪个更快
    这篇文章主要介绍了PHP中switch和ifelse哪个更快,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。PHP的switch和ifelse哪个更快?对于多个if条件判断的情...
    99+
    2023-06-15
  • LeetCode上的Java和JavaScript:哪个更快?
    LeetCode是一个非常受欢迎的在线编程平台,它提供了大量的算法和数据结构题目,帮助程序员提高他们的编程技能。在LeetCode上,Java和JavaScript是两种最常用的编程语言。但是,哪种语言更快?在本文中,我们将探讨Java和J...
    99+
    2023-09-29
    load leetcode javascript
  • PHP 和 Bash 的性能比较:哪个更快?
    在编写脚本时,许多开发人员可能会使用 Bash 或 PHP。两种语言都有其优点和缺点,但是在性能方面,哪个更快呢?在本文中,我们将比较 Bash 和 PHP 的性能,并提供一些演示代码。 Bash 的性能 Bash 是一种命令行解释器...
    99+
    2023-10-08
    bash load windows
  • MySQL 中一张大表和多个小表哪个更好?
    很难说是喜欢一张大桌子还是多张小桌子。这取决于 - 关于我们正在使用的应用程序。 关于数据库规范化 但是有很多关键点,通过这些点我们可以说多个小表是 在这种情况下很好。 假设很多开发者要开发多个表,那么就需要拆分 它们分成多个小表。 您向许...
    99+
    2023-10-22
  • StringUtils和CollectionUtils判断为空的方法哪个速度更快
    这篇文章主要介绍StringUtils和CollectionUtils判断为空的方法哪个速度更快,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!结论 自己直接写判断效率高(一般是0ms),但是封装的简便、严谨...
    99+
    2023-06-29
  • Java 中的 clone( ) 和 new哪个效率更高
    对象创建的几种方法: 使用new关键字 使用clone方法 反射机制 反序列化 以上四种都可以产生java对象 1,3都会明确的显式的调...
    99+
    2022-11-12
  • Java中clone( ) 和 new效率更高的是哪个
    这篇文章主要介绍Java中clone( ) 和 new效率更高的是哪个,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!对象创建的几种方法:使用new关键字使用clone方法反射机制反序列化...
    99+
    2023-06-21
  • PHP中数组和对象的比较:哪个更好?
    PHP是一种广泛使用的编程语言,它支持多种数据类型,其中数组和对象是最常用的两种数据类型之一。虽然它们都可以用来存储和操作数据,但它们有着明显的差异。那么,PHP中数组和对象哪个更好呢?在本文中,我们将介绍它们的区别和使用场景。 数组是PH...
    99+
    2023-08-24
    linux 数组 对象
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作