count(1)比count(*)效率高?
SELECT COUNT(*) FROM table_name
是个再常见不过的统计需求了。
本文带你了解下Mysql
的COUNT
函数。
一、COUNT
函数
关于COUNT
函数,在MySQL
官网中有详细介绍:
翻译一下:
COUNT(expr)
,返回SELECT
语句检索的行中expr
的值不为NULL
的数量,结果是一个BIGINT
值。- 如果查询结果没有命中任何记录,则返回
0
COUNT(*)
的统计结果中,会包含值为NULL
的行数。
在《阿里巴巴Java开发手册》也有如下要求:
二、COUNT(列名)
、COUNT(常量)
和COUNT(*)
前面我们提到过
COUNT(expr)
用于做行数统计,那么COUNT(列名)
、COUNT(常量)
和COUNT(*)
这三种语法中,expr
分别是列名、 常量 和*
。
2.1 COUNT(*)
和COUNT(常量)
在列名、常量和 *
这三个条件中,常量是一个固定值,肯定不为NULL
。*
可以理解为查询整行,所以肯定也不为NULL
,那么就只有列名的查询结果可能是NULL
。
所以, COUNT(常量)
和 COUNT(*)
表示的是直接查询符合条件的数据库表的行数。而COUNT(列名)
表示的是查询符合条件的列的值不为NULL
的行数。
2.2 COUNT(*)
和COUNT(1)
区别
COUNT(1)
就是COUNT(常量)
,对于这二者到底有没有区别:
- 有的说
COUNT(*)
执行时会转换成COUNT(1)
,所以COUNT(1)
少了转换步骤,所以更快。 - 还有的说,因为
MySQL
针对COUNT(*)
做了特殊优化,所以COUNT(*)
更快。
到底哪种说法是对的?看下MySQL
官方文档:
InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.
通过文档,对于COUNT(1)
和COUNT(*)
,MySQL
的优化是完全一样的,根本不存在谁比谁快!
2.3 COUNT(列名)
相较于前两者,COUNT(列名)
的查询就比较简单粗暴了,就是进行全表扫描,然后判断指定字段的值是不是为NULL
,不为NULL
则累加。
相比
COUNT(*)
,COUNT(列名)
多了一个步骤就是判断所查询的字段是否为NULL
,所以他的性能要比COUNT(*)
慢。
here和group的条件查询。
2.4 SQL92
除了查询得到结果集有区别之外,COUNT(*)
相比COUNT(常量)
和 COUNT(列名)
来讲,COUNT(*)
是SQL92
定义的标准统计行数的语法,因为他是标准语法,所以MySQL
数据库对他进行过很多优化。
SQL92
,是数据库的一个ANSI/ISO
标准。它定义了一种语言(SQL
)以及数据库的行为(事务、隔离级别等)。
2.5 COUNT(*)
优化
因为COUNT(*)
是SQL92
定义的标准统计行数的语法,所以MySQ
L对其进行了很多优化:
MyISAM
中会直接把表的总行数单独记录下来供COUNT(*)
查询InnoDB
会在扫表的时候选择最小的索引来降低成本。
这些优化的前提都是没有进行
where
和group
的条件查询,更多请参考MySQL 全表 COUNT(*) 简述
三、总结
COUNT
函数用于统计表行数,按照效率比较的话:
count(*)=count(常量)>count(列名)
3.1 小建议
既然 count(*)
在查询上依赖于所有的数据集,所以我们在设计上也需要尽量的规避全量 count
。
通常情况我们针对可预见的 count
查询会做适当的缓存,可以是 Redis
,也可以是独立的 MySQL
count
表。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?