mysql中count(*)、count(1)和count(字段)的区别
目录
- `count(*)`、`count(1)` 和 `count(字段)` 区别
- `count(主键id)` 与 `count(1)`
- `count(*)` 与 `count(字段)`
- `count(字段)`
- `count(*)`
- `count()` 的优化
- `count()` 的优化
count(*)
、count(1)
和 count(字段)
区别
count()
是一个聚合函数,对于返回的结果集,一行行地判断,如果 count
函数的参数不是 NULL
,累计值就加 1
,否则不加。最后返回累计值
count(*)
、count(主键id)
和 count(1)
都表示返回满足条件的结果集的总行数;而count(字段)
则表示返回满足条件的数据行里面,参数“字段”
不为 NULL
的总个数
count(主键id)
与 count(1)
- 对于
count(主键id)
来说,InnoDB
引擎会遍历整张表,把每一行的id
值都取出来,返回给server
层。server
层拿到id
后,判断id
不为NULL
的,就按行累加 - 对于
count(1)
来说,InnoDB
引擎遍历整张表,但不取值。server
层对于返回的每一行,放一个数字“1”
进去,判断是不可能为空的,按行累加 - 总的来说,
count(1)
执行得要比count(主键id)
快一些。因为从引擎返回id
会涉及到解析数据行,以及拷贝字段值的操作
count(*)
与 count(字段)
count(字段)
- 如果这个
“字段”
定义为not null
,一行行地从记录里面读出这个字段,判断不可能为null
,按行累加 - 如果这个
“字段”
定义为null
,那么执行的时候,判断到有可能是null
,还要把值取出来再判断一下,不是null
才累加
count(*)
count(*)
是例外,优化器专门对其做了优化,并不会把全部字段取出来,而是直接按行累加
按照效率排序,count(字段)
< count(主键id)
< count(1)
≈ count(*)
,所以尽量使用 count(*)
就行了
count()
的优化
如果 count()
的括号中定义了列名或其它表达式,count
就会统计这个表达式有值的次数,不会统计 null
count
的另一种形式就是统计结果中行的数量,当 mysql
知道括号中的表达式永远都不会为 NULL
的时候,它就会按这种方式工作。例如 count(*)
,它是 count
的一种特例,它不会把通配符 *
展开成所有的列,而是忽略所有的列并统计行数
一个最常见的错误就是,在括号内指定了一个列却希望统计结果集的行数。如果希望知道的是结果集的行数,最好使用 count(*)
,这样写意义清晰,性能也会很好
- 对于
MyISAM
存储引擎,当在单表中没有限定where
查询条件时count(*)
是非常快的,因为MyISAM
本身已经在磁盘上存了这个行数总值,但是当存在where
限定条件,是需要进行查询统计的 - 为什么
InnoDB
不跟MyISAM
一样,也把数字存起来呢? 这是因为即使是在同一个时刻的多个查询,由于多版本并发控制(MVCC
)的原因,InnoDB
表“应该返回多少行”对于不同的查询也是不确定的。InnoDB
引擎执行count(*)
的时候,需要把数据一行一行地从引擎里面读出来,每一行记录都要判断自己是否对这个会话可见,然后累积计数。因此对于count(*)
请求来说,InnoDB
只好把数据一行一行地读出依次判断,可见的行才能够用于计算“基于这个查询”的表的总行数
count()
的优化
- 简单的优化:如果只需要近似值,那么使用
EXPLAIN
出来的优化器估算的行数rows
就是一个不错的近似值,执行EXPLAIN
并不需要真正地去执行查询,所以成本很低 - 更复杂的优化:通常来说,
count()
都需要扫描大量的行(意味着要访问大量数据)才能获得精确的结果,因此是很难优化的。mysql
层面能做的通常只有是覆盖索引了,尽量通过索引来统计数量,或者单独使用一个汇总表来统计,或者增加一个外部的缓存系统用来计数
转载:https://blog.csdn.net/weixin_43767015/article/details/119904067?spm=1001.2014.3001.5501
mysql中count(*)、count(1)和count(字段)的区别相关推荐
- mysql中双引号和单引号有什么区别
mysql中双引号和单引号有什么区别 前2天看到有人问,mysql中双引号和单引号有什么区别? 希望大家可以关注下公众号,支持一下,鞠躬感谢~ 我就直接po代码和截图了,如下 select * fro ...
- mysql 中 RC、RR隔离级别的原理及区别
今天分享 mysql 中 RC.RR隔离级别的原理及区别: 1.首先简介mysql四种隔离级别: 1)未提交读(READ UNCOMMITED)脏读 2) 已提交读 (READ COMMITED)简称 ...
- Mysql中where 1=1 和count(0) 使用小技巧
1. 数据库语句 where 1=1 的用法和作用 这是一种怎样的查询语句呢?首先说明,1=1不是查询语句中的任何关键词,所以,请您放心,不管你会不会使用 这种语句,都没有任何关系,对于您而言,没有任 ...
- MySQL中的升序降序以及字段的升序降序
MySQL中 升序为asc 降序为desc 例如: 升序:select * from 表名 order by 表中的字段 asc(MySQL中默认是升序排列,可不写) : 降序:select ...
- MySQL中的哥哥表、妹妹字段,是什么鬼?
原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处. 晚上,我被叫进宽大的办公室,总监正在煮茶.高压锅煮着长嘴茶壶,水蒸气缭绕.领导举手之间,淡黄茶水奔涌而出,倒立而下浇上茶叶 ...
- mysql中nchar_浅谈SQL Server、MySQL中char,varchar,nchar,nvarchar区别
1,定义: char: 固定长度,存储ANSI字符,不足的补英文半角空格. nchar: 固定长度,存储Unicode字符,不足的补英文半角空格 varchar: 可变长度,存储ANSI字 ...
- MySQL中 int(11)和int(10)有没有区别
引言 依稀还记得有次面试,有面试官问我int(10)与int(11)有什么区别,当时觉得就是长度的区别吧!面试官最后也没有给反馈,我也就以为自己答对了.直到有一次有个同学又跟我谈起这个事,才去查了以下 ...
- mysql中时间类型datetime,timestamp与int的区别
在mysql中存储时间,我们可以用datetime 格式,timestamp格式,也可以用int格式.那么我们设计的时候该如何考虑呢? 首先,我觉得应该明白这几个格式究竟是如何的,然后看看他们的区别, ...
- mysql中的BIT_LENGTH和LENGTH以及CHAR_LENGTH的区别
mysql中获取字符的长度的常见函数有以上三种,他们的区别在于衡量长度的单位是不同的. 目录 背景描述 mysql中长度函数描述 使用案例 背景描述 ASCII码 因为计算机是美国人发明和最早使用的, ...
- 字段类型:mysql中int(3)与int(11)有什么区别吗?优化数据库字段占据磁盘的大小
文章目录 案例 数值类型 日期和时间类型 字符串类型 案例 int(M) 注意:这里的M代表的并不是存储在数据库中的具体的长度,以前总是会误以为int(3)只能存储3个长度的数字,int(11)就会存 ...
最新文章
- phoenix 开发API系列(三)phoenix api 结合数据库
- zephir开发的扩展“wudimei框架”之数据库使用方法
- 分布式系统原理 之6 两阶段提交协议
- 32位md5解密_冰蝎特征检测及报文解密
- 每天一算法之插入排序
- 机器学习面试--决策树
- BUG--tomcat更改目录失败
- vba mysql 3706_Excel、VBA与MySQL交互
- 如何截取QQ密码和聊天内容、去掉QQ广告栏、添加QQ尾巴
- EXCEL函数常用技巧浅析
- 显卡故障软件测试,显卡软硬件故障检查与排除实战
- 电动执行器平时应该怎么去维护和保养?
- Ubuntu虚拟机下载(清华大学开源软件镜像源)
- 迅雷 极速版 1.0.35.366
- 互联网晚报 |11/23星期三 | 京东高管降薪10%至20%;75%未成年每周游戏少于3小时;惠普宣布未来三年裁员4K-6K人...
- Python|计算圆柱体的表面积
- 数据中台架构体系理解
- ActiveX控件的MFC实现(VS2017,OpenGL)
- java书籍 李清华_201772020113 李清華《面向對象程序設計(java)》第18周學習總結...
- 一文看懂向量的概念及其几何意义
热门文章
- 算法:找出存在子字符串的最先位置28. Implement strStr()
- 易筋SpringBoot 2.1 | 第三十四篇:Spring Boot导出war包部署到外部Tomcat
- OperationQueue与属性maxConcurrentOperationCount的那些事
- 做柜员还是程序员_未来的程序员,还是“高薪一族”吗?
- python无法打开txt_在Python中打开“.txt”文件
- 凸优化第五章对偶 5.5最优性条件
- Boost C++ 智能指针
- 【生信进阶练习1000days】day1-Bioconductor的一些补充小用法与Working with Genomic Ranges
- java点击菜单项弹出对话框_java怎么通过点击菜单弹出对话框
- js-01_面向对象选项卡