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
- 关于资源售价和售后服务的说明?
- 代码有没有售后服务和技术支持?
- 有没有搭建服务?
- 链接地址失效了怎么办?
- 关于解压密码

