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
表。
3.2 技术交流
count(1)比count(*)效率高?的更多相关文章
- 你是一直认为 count(1) 比 count(*) 效率高么?
MySQL count(1) 真的比 count(*) 快么? 反正同事们都是这么说的,我也姑且觉得对吧,那么没有自己研究一下究竟?如果我告诉你他们一样,你信么? 有 Where 条件的 count, ...
- 你还在认为 count(1) 比 count(*) 效率高?
你还在认为 count(1) 比 count(*) 效率高? 3 很多人认为count(1)执行的效率会比count()高,原因是count()会存在全表扫描,而count(1)可以针对一个字段进行查 ...
- Select count(*)、Count(1)、Count(0)的区别和执行效率比较
记得很早以前就有人跟我说过,在使用count的时候要用count(1)而不要用count(*),因为使用count(*)的时候会对所有的列进行扫描,相比而言count(1)不用扫描所有列,所以coun ...
- MySQL的统计总数count(*)与count(id)或count(字段)的之间的各自效率性能对比
执行效果: 1. count(1) and count(*) 当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了! 从执行计划来看,count(1)和cou ...
- mysql 5.7中 count(0) count(*) count(主键) count(非空字段)效率比较
mysql count(0) count(*) count(主键) count(非空字段) 效率比较 写代码的时候经理在背后说了一句count(0)的效率高于count(*) ,索性全部测试了一下 结 ...
- select count(*)和select count(1)哪个性能高
select count(*).count(数字).count(字段名)在相同的条件下是没有性能差别的,一般我们在统计行数的时候都会把NULL值统计在内的,所以这样的话,最好就是使用COUNT(*) ...
- select count(*)和select count(1)的区别 (转)
A 一般情况下,Select Count (*)和Select Count(1)两着返回结果是一样的 假如表沒有主键(Primary key), 那么count(1)比count(*)快, 如果有主键 ...
- count(*),count(1)和count(主键) 区别
看如下数据: SQL> select count(*) from ysgl_compile_reqsub; COUNT(*) ---------- 已用时间: : : 07.51 SQL) fr ...
- sql中奇怪的sum(1),sum(2),count(1),count(6),count(*):统计总数
sql的统计函数 sql统计函数有 count 统计条数,配合group用 sum 累加指定字段数值 但注意sum(1)就特殊 sum(1)等同于count(*) sum(1)统计个数,功能和coun ...
随机推荐
- xlwings excel(二)
常用函数和方法 Book 工作簿常用的apiwb=xw.books[‘工作簿名称'] wb.activate()激活为当前工作簿 wb.fullname 返回工作簿的绝对路径 wb.name 返回工作 ...
- BZOJ 2095 Bridges
题目传送门 分析: 首先就是二分 然后... 混合图欧拉回路是sm... 看了题解Orz 首先要回到原来的点的话,那么每个点入度和出度要相等... 这..和网络流进入点之后就出去不是一样的吗.. 又由 ...
- window平台基于influxdb + grafana + jmeter 搭建性能测试实时监控平台
一.influxdb 安装与配置 1.1 influxdb下载并安装 官网无需翻墙,但是下载跳出的界面需要翻墙,我这里提供下载链接:https://dl.influxdata.com/influxdb ...
- [校内训练19_09_05]ca
题意 对于任意1 ≤k≤N,求有多少个左右区分的恰有k个叶子节点的二叉树,满足对于每个节点要么没有叶子节点要么有两个节点,同时不存在一个叶子节点,使得根到它的路径上有不少于M条向左的边. 答案对998 ...
- STM8 ADC1连续模式切换通道干扰问题的解决
初始化ADC1: void Init_ADC(void){ GPIO_Init(GPIOD, (GPIO_Pin_TypeDef)(GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_5|G ...
- STM8 关闭PWM输出后的电平输出问题解决
STM系列的单片机PWM输出如果被关断比如用TIM1_CtrlPWMOutputs进行停止输出后,电平的高低处于不确定的状态. 他取决于: 1.GPIO初始化的特性 2.关断那一刻时的电平 3.CCM ...
- 浅谈DFS,BFS,IDFS,A*等算法
搜索是编程的基础,是必须掌握的技能.--王主任 搜索分为盲目搜索和启发搜索 下面列举OI常用的盲目搜索: 1.dijkstra 2.SPFA 3.bfs 4.dfs 5.双向bfs 6.迭代加深搜索( ...
- JQuery--JQuery面向对象编程快速入门-插件开发
JQuery源码片段分析 (function(window){ /** * jQuery是一个函数 是一个对象 是一个构造器函数 */ var jQuery = function( selector, ...
- 文件系统(01):基于SpringBoot框架,管理Excel和PDF文件类型
本文源码:GitHub·点这里 || GitEE·点这里 一.文档类型简介 1.Excel文档 Excel一款电子表格软件.直观的界面.出色的计算功能和图表工具,在系统开发中,经常用来把数据转存到Ex ...
- 20190710双人开黑CF模拟赛
Codeforces Round #571 (Div. 2) 日常被tanao_大佬带飞,我AC了A和C(B题没了...否则tanao_大佬肯定把我吊打) A. Vus the Cossack and ...