MySQL 的COUNT(x)性能怎么样?

做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!文章目录0 说明1 总结2 拓展x 可以代表: 主键id、字段、1、*0 说明对于count(主键id)来说innodb引擎会遍历整张表,把每一行的id值都取出来,返回给server层,server层判断id值不为空,就按行累加对于count(字段)来说如果这个字段定义为not null,一行行的从记…

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

做一个积极的人

编码、改bug、提升自己

我有一个乐园,面向编程,春暖花开!

文章目录

x 可以代表: 主键id、字段、1、*

0 说明

对于count(主键id)来说

innodb引擎会遍历整张表,把每一行的id值都取出来,返回给server层,server层判断id值不为空,就按行累加

对于count(字段)来说

如果这个字段定义为not null,一行行的从记录里面读出这个字段,判断不为空,则累加值

如果这个字段定义允许为null,那么执行的时候,判断到有可能为null,还要把值取出来在判断一下,不是null才累加

对于count(1)来说

innodb引擎遍历整张表,但不取值,返回给server层,server对于返回的每一行,放一个数字1进去,判断是不可能为空的,就按行累加

对于count(*)

并不会把全部字段取出来,而是专门做了优化,不取值,count(*)肯定不是null,按行累加

1 总结

如果你要统计行数就用count(*)或者count(1),推荐前者

如果要统计某个字段不为NULL值的个数就用count(字段)

在《**高性能MySQL》**中有如下:

  1. 当mysql确认括号内的表达式值不可能为空时,实际上就是在统计行数

  2. 如果mysql知道某列col不可能为NULL值,那么mysql内部会将count(col)表达式优化为count(*)

也就是说count(主键字段)和count(1)还是要优化到count(*)的。

MySQL 5.7 Reference Manual 的官方手册中: https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_count

有这么一段:

InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.

翻译: InnoDB以相同的方式处理SELECT COUNT(*)和SELECT COUNT(1)操作。没有性能差异。

所以这几个按照效率排序的话,count(字段)<count(主键id)<count(1)≈count(*)

所以,尽量使用count(*)

2 拓展

在阿里巴巴的 Mysql数据库 >> ( 三) ) SQL

在这里插入图片描述


谢谢你的阅读,如果您觉得这篇博文对你有帮助,请点赞或者喜欢,让更多的人看到!祝你每天开心愉快!


不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!

博客首页 : https://aflyun.blog.csdn.net/

愿你我在人生的路上能都变成最好的自己,能够成为一个独挡一面的人
MySQL 的COUNT(x)性能怎么样?

© 每天都在变得更好的阿飞云

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/121010.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • LaTeX 插入图片

    LaTeX 插入图片啊

  • flash做动画教程(基础篇)

    flash做动画教程(基础篇)第一步、软件的下载与安装FlashMX2004第二步、新建一个flash文档也就是场景一你可以右击空白的文档,作如下操作:一、改变文档的背景颜色二、根据自己制作gif动态图片的大小,来选择文档的宽高二、新建元件或者是导入外部图片有的图片是不需要自己加工的素材就从外部导入导入外部图片的步骤:文件-导入-导入到库-选择图片的位置…

  • Java中instanceof关键字的理解「建议收藏」

    Java中instanceof关键字的理解「建议收藏」Java中instanceof关键字的理解

  • 使SplitContainer中某个Panel宽度、高度不变[通俗易懂]

    使SplitContainer中某个Panel宽度、高度不变[通俗易懂]1.在窗体load时加入:splitContainer_AllLayout.SplitterDistance=120;上边代码字面意思是将水平、或垂直分开的SplitContainer的分区长度设置为1202.只要设置FixedPanel属性为希望宽度不变的panel即可:3.再设置控件不可拖动:splitContainer_AllLayout.IsSplitter…

  • 女儿满月请柬正确的书写格式图片_乔迁请柬怎么写 范文

    女儿满月请柬正确的书写格式图片_乔迁请柬怎么写 范文XXX台启:谨于公元二零零九年公历二月二十一日农历正月二十七日(星期六)为爱女举办满月之喜薄酌恭请阖第光临席设:土湖新美味城(一分店)时间:中午十一点半XXX敬邀满月酒请帖是满月

  • 正则表达式中的特殊字符一览[通俗易懂]

    正则表达式中的特殊字符一览[通俗易懂]
    正则表达式中的特殊字符一览
     
    〓简介〓
    字符意义:对于字符,通常表示按字面意义,指出接着的字符为特殊字符,不作解释。
    例如:/b/匹配字符’b’,通过在b前面加一个反斜杠,也就是/b/,则该字符变成特殊字符,表示匹配一个单词的分界线。或者:对于几个字符,通常说明是特殊的,指出紧接着的字符不是特殊的,而应该按字面解释。例如:*是一个特殊字符,匹配任意个字符(包括0个字符);例如:/a*/意味匹配0个或多个a。为了匹配字面上的*,在a前面加一个反斜杠;

发表回复

您的电子邮箱地址不会被公开。

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