MySQL中count(字段) ,count(主键 id) ,count(1)和count(*)的区别

MySQL中count(字段) ,count(主键 id) ,count(1)和count(*)的区别

大家好,又见面了,我是全栈君。

注:下面的讨论和结论是基于 InnoDB 引擎的。

首先要弄清楚 count() 的语义。count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1,否则不加。最后返回累计值。

所以,count(*)、count(1)和count(主键 id) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。

至于分析性能差别的时候,记住这么几个原则:

  • server 层要什么就给什么;

  • InnoDB 只给必要的值;

  • 现在的优化器只优化了 count(*) 的语义为“取行数”,其他“显而易见”的优化并没有做。

count(可空字段)

扫描全表,读到server层,判断字段可空,拿出该字段所有值,判断每一个值是否为空,不为空则累加

count(非空字段)与count(主键 id)

扫描全表,读到server层,判断字段不可空,按行累加。

count(1)

扫描全表,但不取值,server层收到的每一行都是1,判断不可能是null,按值累加。

注意:count(1)执行速度比count(主键 id)快的原因:从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。

count(*)

MySQL 执行count(*)在优化器做了专门优化。因为count(*)返回的行一定不是空。扫描全表,但是不取值,按行累加。

看到这里,你会说优化器就不能自己判断一下吗,主键 id 肯定是非空的,为什么不能按照 count(*) 来处理,多么简单的优化。当然 MySQL 专门针对这个语句进行优化也不是不可以。但是这种需要专门优化的情况太多了,而且 MySQL 已经优化过 count(*) 了,你直接使用这种语句就可以了。

性能对比结论

count(可空字段) < count(非空字段) = count(主键 id) < count(1) ≈ count(*)

MySQL中count(字段) ,count(主键 id) ,count(1)和count(*)的区别

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111748.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Raid0、 Raid1、 Raid5、 Raid10的原理、特点、性能区别[通俗易懂]

    Raid0、 Raid1、 Raid5、 Raid10的原理、特点、性能区别[通俗易懂]一、RAID是什么?RAID(RedundantArrayofIndependentDisks)即独立磁盘冗余阵列,简称为「磁盘阵列」,其实就是用多个独立的磁盘组成在一起形成一个大的磁盘系统,从而实现比单块磁盘更好的存储性能和更高的可靠性。二、RAID有哪些?RAID方案常见的可以分为:RAID0 RAID1 RAID5 RAID6 RAID10下面来分别介绍一下。Raid0:至少需要两块硬盘,磁盘越多,读写速度越快,没有冗余。Raid1:只能用两块硬

    2022年7月25日
    21
  • Java递归下降分析器_递归下降语法分析器[通俗易懂]

    Java递归下降分析器_递归下降语法分析器[通俗易懂]用java语言编写的递归下降语法分析器,是一种适合手写语法编译器的方法,且非常简单。递归下降法对语言所用的文法有一些限制,但递归下降是现阶段主流的语法分析方法,因为它可以由开发人员高度控制,在提供错误信息方面也很有优势。就连微软C#官方的编译器也是手写而成的递归下降语法分析器。使用递归下降法编写语法分析器无需任何类库,编写简单的分析器时甚至连前面学习的词法分析库都无需使用。我们来看一个例子:现在有…

    2022年6月29日
    25
  • sdfsdfsdsdfsdf

    sdfsdfsdsdfsdf3444444grggerggdfgdgd你好!这是你第一次使用Markdown编辑器所展示的欢迎页。如果你想学习如何使用Markdown编辑器,可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计,将会带…

    2022年10月4日
    1
  • 火星坐标系统_怎样算自己的上升星座

    火星坐标系统_怎样算自己的上升星座其原理是这样的:保密局开发了一个系统,能将实际的坐标转换成虚拟的坐标。所有在中国销售的数字地图必须使用这个系统进行坐标转换之后方可上市。这是生产环节,这种电子地图被称为火星地图。在使用环节,GPS终端

    2022年8月2日
    5
  • IDEA 2021.7.21 激活码【中文破解版】

    (IDEA 2021.7.21 激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月22日
    53
  • yum 命令讲解「建议收藏」

    yum 命令讲解「建议收藏」(一)yum介绍Yum(全称为YellowdogUpdater,Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。yum提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。 …

    2022年5月5日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号