MySQL count
2024-08-31 23:21:19
https://www.jianshu.com/p/1b0a1f641e80]
不同引擎count(*)实现方式不同
- MyISAM引擎把一个表的总行数记录在了磁盘上,执行count(*)会直接返回这个数值,效率很高。
- InnoDB,执行count(*),需要把数据一行行的从引擎中读出来,然后累积计数。
InnoDB对count(*)的优化
- 我们知道,InnoDB是索引组织表,主键索引的叶子节点保存的是数据;普通索引的叶子节点保存的是主键值。所以,普通索引比主键索引小,对于count(*)这样的操作,遍历哪个索引树得到的结果逻辑上是一样的,因此,MySQL优化器会找到最小的索引树来遍历,在保证逻辑正确的前提下,尽量减少扫描的数据量,是数据库系统设计的通用法则之一。
show table status与count(*)
- show table status命令输出结果中有一个TABLE_ROW值,但不能代替cout(*),因为它是通过采样统计计算的,误差较大(可能达到40%-50%)。
聚合函数count()
- count()是一个聚合函数,对于返回结果,一行行的判断,如果count函数的参数不是NULL,累计值就+1,否则不加,最后返回累计值。
- count(*)、count(id)、count(1)都表示返回满足查询条件的结果集的总行数;count(字段),表示返回满足条件的数据行里面参数字段不为NULL的结果的总个数。
不同count参数性能对比
- count(主键id):InnoDB引擎会遍历整张表,把每一行id值都取出来,返给server层。server层拿到id后,判断是不可能为空的,就按行累加,不再对每个值进行NULL判断。
- count(1):InnoDB引擎会遍历整张表,但不取值。server层对于返回的每一行,放一个数字“1”进去,判断是不可能为空的,按行累加,不再对每个值进行NULL判断。
count(1)比count(主键id)执行的要快,因为从引擎放回id会涉及解析数据行,以及拷贝字段值的操作。 - count(字段):
1、如果参数字段定义NOT NULL,判断是不可能为空的,按行累加,不再对每个值进行NULL判断。
2、如果参数字段定义允许为NULL,那么执行的时候,判断可能是NULL,还要把值取出来再判断一下,不是NULL才累加。
这也是定义字段时建议设置NOT NULL的原因之一。 - count(*):前面说过,InnoDB专门对它做了优化
- 结论:对于InnoDB引擎,按效率排序,count(字段) < count(主键id) < count(1) ≈ count(*),建议尽量使用count(*)
最新文章
- MAC OS X的ACL扩展权限设置
- C/S架构程序多种类服务器之间实现单点登录(转)
- android电视安装爱奇艺等不能看视频问题
- ORA-12519, TNS:no appropriate service handler found
- Oralce 处理字符串函数
- JS同源策略和跨域问题
- Dynamic Performance Tables not accessible Automatic Statistics disabled for this session
- Visual Studio 2015的安装与基本使用
- 使用DataFlow表达ControlFlow的一些思考
- eclipse点击空白处自动打开项目
- Lambda的使用与实战
- [Swift]LeetCode486. 预测赢家 | Predict the Winner
- HttpInvoker客户端动态调用Demo
- 【转载】ubuntu下/usr/bin和/usr/local/bin的区别
- Java高级面试题解析(一)
- 20175312 2018-2019-2 《Java程序设计》第1周学习总结
- 简单的TSQL基础编程格式,存储过程,视图
- [ 测试思维 ] 启发式测试策略模型(HTSM)
- PAT 1033 旧键盘打字(20)(20 分)
- BoneBlack am335x can0 通讯配置与测试