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)
上一篇 2022年2月15日 下午1:00
下一篇 2022年2月15日 下午2:00


相关推荐

  • 2022年idea激活码[最新免费获取]

    (2022年idea激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月22日
    192
  • 伯努利分布、二项分布、多项分布、Beta分布、Dirichlet分布

    伯努利分布、二项分布、多项分布、Beta分布、Dirichlet分布https blog csdn net michael r chang article details 39188321http www cnblogs com wybang p 3206719 htmlhttps blog csdn net jteng article details 603346281 伯努利分布伯努利分布 Bernoullidis 又名两点

    2026年3月17日
    3
  • _beginThread如何传递多个参数

    _beginThread如何传递多个参数PS 对于一个 C 渣来说 能在网上找到简单直白的解释真的是不容易 有时候给几个简单的例子才是直击心灵啊 翻了那么多篇介绍 beginThread 传递多个参数的文章看到这篇的时候我都要膨胀了 233 原文连接 http blog sina com cn s blog 5357c0af0100 html 再次感谢博主 include lt process h gt incl

    2026年3月19日
    2
  • MATLAB绘制三维地图「建议收藏」

    MATLAB绘制三维地图「建议收藏」1、meshgrid:生成格点矩阵,类似于给定坐标空间[x,y]=meshgrid(1:10);

    2022年10月11日
    3
  • JAVA简历1到三年

    JAVA简历1到三年JAVA开发工程师_3年基本资料求职意向意向职位: Java开发工程师 求职地址:北京期待薪资:面议到岗时间:随时工作性质:全职 目前状况:已离职个人技能1.熟练Java语言基础语法以及面向对象特征。2.熟练Java语言中常用API的使用,如IO,String,Collection等。3.熟练MySQL的增删改查操作以及JDBC数据库连接池的使用。4.熟悉Git这种分布式版本的控制系统的使用。5.熟悉Spring、Springmvc、M

    2022年7月7日
    27
  • response的contentType 几种类型

    response的contentType 几种类型response的contentType 几种类型

    2022年4月22日
    130

发表回复

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

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