MySQL中的COUNT函数,你理解多少

MySQL中的COUNT函数,你理解多少

前言:COUNT函数相比大家都不陌生,接触过数据库的兄弟们想必都用过MySQL中的COUNT函数,你理解多少,但是,就是这个常用的COUNT函数,却暗含许多玄机。

1、COUNT简介

看看官网对COUNT的简介

大致意思是:COUNT(expr)返回语句中expr值不为NULL的行数,返回的结果类型为;当没有匹配的行时,返回0;(*)将返回包括NULL值的行数。

2、COUNT函数常用的几种用法

COUNT(常量),COUNT(*),COUNT(字段),那么他们之间都有什么区别。

实际上,从前面的简介中就可以看出,COUNT(字段)和COUNT(*)的区别,COUNT(字段)返回的行数是不包括该字段为NULL的字段的,而COUNT(*)返回的行数其实就是实际查询结果的总行数,那么我们再看看COUNT(常量),举个例子,例如COUNT(1),1肯定不为NULL,那么根据MySQL COUNT(expr)的简介,返回expr值不为NULL的行数,那么其实COUNT(常量)返回的也是实际查询结果的总行数。

下面我们建个表简单测试一下:

create table count_test(col1 varchar(1),col2 varchar(1));
insert into count_test value ('1','1');
insert into count_test value ('1',null);
insert into count_test value (null,'1');
insert into count_test value ('1','1');
insert into count_test value (null,'1');
insert into count_test value ('1','1');
select COUNT(1),COUNT(*),COUNT(col1),COUNT(col2) from count_test;

3、COUNT(*)和COUNT(1)到底该怎么选择

如果有看过阿里的开发手册,就会知道阿里强制要求开发人员使用COUNT(*)进行数据统计mysql count,而非是COUNT(1),到底是为什么呢?

在SQL92中,COUNT(*)是标准的统计行数的语法,而作为标准语法,MySQL本身其实是对COUNT(*)做了很多优化的MySQL中的COUNT函数,你理解多少,那么我们接下来看看MySQL对COUNT(*)做了哪些优化。

MySQL对COUNT(*)其实在不同的存储引擎中是不同的,那么我们主要看看两种常用的存储引擎和。

首先我们简单看看和的区别。不支持事务mysql count,并且使用的是表锁;支持事务,并且支持行锁。

接下来我们看看到底做了什么优化:

那么回到前面的对COUNT(*)的优化,MySQL会尽量选择一个成本最小的索引进行全表扫描,显然扫描非聚簇索引索引的成本是远远小于扫描聚簇索引的,而MySQL会选择一个成本最小的非聚簇索引进行全表扫描,这么说来,其实创建一个非主键索引也是非常必要的。当然这些都是在查询语句不包含where、group by等的前提下。

那么,有的人会说了,难道MySQL只对COUNT(*)做了优化,对COUNT(1)没有做优化吗?我们看看MySQL官方是怎么说。

COUNT(*) and COUNT(1) in the same way. There is no .

大意是说:对于COUNT(1)和COUNT(*),MySQL的优化是完全一样的,根本不存在谁比谁快!

那么既然COUNT(1)和COUNT(*)优化一致,而COUNT(*)又是SQL92定义的标准统计语法,那么为啥不用COUNT(*)呢?

4、总结

本文简单介绍了MySQL中COUNT(字段),COUNT(常量),COUNT(*)之间的区别,相对于COUNT(字段),COUNT(常量)和COUNT(*)的效率更高,并且查询的结果是实际的总行数(包括NULL)mysql count,而COUNT(*)又是SQL92定义的标准语法,所以在日常工作中推荐使用COUNT(*)进行行统计。

不知道大家有没有发现,本文中关于MySQL对COUNT(*)的优化都有一个前提,那就是查询语句不能包括where、group by,那么在有where的条件下,MySQL又是如何对COUNT(*)进行优化的呢,这个留作一个问题,在下篇文章中进行分析。

——————————————————————————————–

大佬文章:

公告:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299

资源库 - 资源分享下载网 » MySQL中的COUNT函数,你理解多少

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们