当前位置:网站首页>MySQL中count(*)的实现方式
MySQL中count(*)的实现方式
2022-07-06 09:20:00 【快醒醒鸭今天你编程了吗?】
在MySQL中,不同的存储引擎,count(*)有不同的实现方式。
MyISAM引擎把一个表的总行数存在在磁盘上,因此执行count(*)的时候会直接返回这个数,效率很高
而InnoDB引擎就很麻烦了,它执行count(*)的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数
以上都是没有加过滤条件的count(*),如果加了where条件的话MyISAM表也是不能返回这么快的。
我们也知道show table status命令的话,就会发现这个命令的输出结果里面也有一个TABLE_ROWS用于显示这个表当前有多少行,这个命令执行挺快的,那这个TABLE_ROWS能代替count(*)吗?
答:当然不可以,TABLE_ROWS是通过采样估算得来的,因此不是很准确,官方文档提到误差可能达到40%~50%,所以show table status 命令显示的行数也不能直接使用
小结:MyISAM表虽然count(*)很快,但是不支持事务
show table status命令虽然返回很快,但是不准确
InnoDB表直接count(*)会遍历全表,虽然结果准确,但是会导致性能问题
如果你现在有一个页面经常要显示交易系统的操作记录总数到底应该怎么办呢?
答案是我们只能自己计数。
- 用缓存系统保存计数
- 在数据库保存计数
说一下count(*)、count(主键id)、count(字段)、count(1)性能有哪些差别?
- count(主键id),InnoDB引擎会遍历整张表,把每一行的id值都取出来,返回给server层,server层拿到id之后,判断是不可能为空的,就按行累加。
- count(1),InnoDB引擎遍历整张表,但不取值,server层对于返回的每一行,放一个数字“1”进去,判断是不可能为空的,按行累加。
单看这两个的话count(1)要比count(主键id)要快,因为从引擎返回id会涉及到解析数据行,以及拷贝字段值的操作。
- count(字段)
- 如果这个“字段”是定义为 not null 的话,一行行地从记录里面读出这个字段,判断不能为 null,按行累加;
- 如果这个“字段”定义允许为 null,那么执行的时候,判断到有可能是 null,还要把值取出来再判断一下,不是 null 才累加。
也就是前面的第一条原则,server层要什么字段,InnoDB就返回什么字段
- count(*)、并不会把全部字段取出来,而是专门做了优化,不取值。count(*)肯定不是null,按行累加
结论:按照效率排序的话,count(字段) < count(主键id) < count(1) 约等于count(*),所以尽量使用count(*)
边栏推荐
- Questions and answers of "basic experiment" in the first semester of the 22nd academic year of Xi'an University of Electronic Science and technology
- TYUT太原理工大学2022数据库大题之数据库操作
- 系统设计学习(二)Design a key-value cache to save the results of the most recent web server queries
- 初识C语言(上)
- 六种集合的遍历方式总结(List Set Map Queue Deque Stack)
- TYUT太原理工大学2022数据库大题之分解关系模式
- 2. C language matrix multiplication
- Iterable、Collection、List 的常见方法签名以及含义
- Design a key value cache to save the results of the most recent Web server queries
- 5. Function recursion exercise
猜你喜欢

Alibaba cloud side: underlying details in concurrent scenarios - pseudo sharing

C语言入门指南

arduino+水位传感器+led显示+蜂鸣器报警

阿里云微服务(二) 分布式服务配置中心以及Nacos的使用场景及实现介绍

2.C语言初阶练习题(2)

Smart classroom solution and mobile teaching concept description

Interview Essentials: talk about the various implementations of distributed locks!

魏牌:产品叫好声一片,但为何销量还是受挫

Abstract classes and interfaces

Introduction and use of redis
随机推荐
IPv6 experiment
【话题终结者】
TYUT太原理工大学2022数据库题库选择题总结
System design learning (I) design pastebin com (or Bit.ly)
C语言入门指南
IPv6 experiment
A brief introduction to the database of tyut Taiyuan University of technology in previous years
图书管理系统小练习
TYUT太原理工大学2022数据库大题之分解关系模式
凡人修仙学指针-1
Comparison between FileInputStream and bufferedinputstream
arduino+水位传感器+led显示+蜂鸣器报警
5. Download and use of MSDN
TYUT太原理工大学2022数据库考试题型大纲
6.函数的递归
Rich Shenzhen people and renting Shenzhen people
Tyut Taiyuan University of technology 2022 "Mao Gai" must be recited
MySQL 30000 word essence summary + 100 interview questions, hanging the interviewer is more than enough (Collection Series
2.C语言矩阵乘法
2.初识C语言(2)