使用MySQL的过程中,有没有遇到过count()比较慢的情况?

news/2025/2/22 0:06:16/

count(*)的实现方式

  • MyISAM引擎把一个表的总行数存在了磁盘上,执行count(*)的时候直接返回这个数,效率很高;

  • InnoDB引擎执行count(*)的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。

上述说明是在没有where条件的时候,如果加了where条件的话,MyISAM表也不能返回得这么快。

InnoDB引擎支持事务,可重复读是它的默认隔离级别,在代码上是通过多版本并发控制(MVCC)实现的,每一行记录都要判断自己是否对这个会话可见,所以无法像MyISAM引擎一样,直接记录一个总行数,当需要的时候返回这个值。如下图所示,返回的总行数并不一样。

图片

InnoDB是索引组织表,主键索引树的叶子节点是数据,而普通索引树的叶子节点是主键值,所以,普通索引树比主键索引树小很多。而对于count(*)这样的操作,遍历哪个索引树得到的结果逻辑上都是一样的,因此,MySQL优化器会找到最小的那棵树来遍历。

show table status命令显示的行数并不准确,不能直接使用。官方文档说误差可能达到40%-50%。

可以采用自己记录总行数的思路,比如把总行数记录到redis或者MySQL中,但是把计数放到redis中,不能够保证计数和MySQL表里的数据精确一致,因为这是两个不同的存储构成的系统,不支持分布式事务,无法拿到精确一致的视图;而把计数值放在MySQL中,就解决了一致性视图的问题。

不同count的用法

count()是一个聚合函数,对返回的结果集,一行行的判断,如果count函数的参数不是NULL,累计值就加1,否则不加,最后返回这个累计值。所以count(*)、count(主键)、count(1)都表示返回满足条件的结果集总行数,而count(字段)则表示返回满足条件的数据行里面,参数“字段”不为NULL的总个数。

按照效率排序:count(字段)<count(主键)<count(1)≈count(*)

正文止。

感兴趣的朋友,欢迎关注我的公众号哈,公众号上已经集成了AI大模型,大家可以过来聊天、问问题了


http://www.ppmy.cn/news/1300426.html

相关文章

Element|Upload结合Progress实现上传展示进度条

背景 &#xff1a; 项目里的 附件上传 题型组件&#xff0c;用户在上传过程中&#xff0c;如果文件较大&#xff0c;上传过程较慢&#xff0c;而又没有一个类似 Loading... 的加载过程的话&#xff0c;会显得干愣愣的&#xff0c;用户体验较差&#xff0c;所以需要添加一个进度…

Mysql InnoDB行锁深入理解

Record Lock记录锁 Record Lock 称为记录锁&#xff0c;锁住的是一条记录。而且记录锁是有 S 锁和 X 锁之分的&#xff1a; 当一个事务对一条记录加了 S 型记录锁后&#xff0c;其他事务也可以继续对该记录加 S 型记录锁&#xff08;S 型与 S 锁兼容&#xff09;&#xff0c;…

232.【2023年华为OD机试真题(C卷)】计算三叉搜索树的高度(JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-计算三叉搜索树的高度二.解题思路三.题解代码P…

LeetCode——2645. 构造有效字符串的最少插入数

通过万岁&#xff01;&#xff01;&#xff01; 题目&#xff1a;给你一个只会有a、b、c三个字母构成的字符串word&#xff0c;然后让你在任意位置添加a、b、c三个字母&#xff0c;使得word变成全都由abc这个字符串拼接而成的字符串。问最少需要插入多少次字母。思路&#xff…

【高等数学之不定积分】

一、什么是不定积分? 我们可以简单地从英文层面来基础剖析一下&#xff0c;什么是不定积分? 1.1、基本概念 小tips: 二、不定积分运算法则 三、常用积分公式 四、第一类换元积分法 4.1、定义 4.2、常用凑微分公式 4.3、小calculate 五、第二类换元积分法 5.1、定义 …

【PyQt小知识 - 7】:QLineEdit设置输入的文本以圆点或星号等方式显示

文章目录 setEchoMode setEchoMode 在PyQt中&#xff0c;QLineEdit是一种用于接收用户输入的小部件&#xff08;widget&#xff09;。setEchoMode是QLineEdit类中的一个方法&#xff0c;可以用于设置文本输入框中的文本显示模式。它接受一个参数来指定要使用的模式。 setEcho…

关于SpringMVC前后端传值总结

一、传递方式 1、查询参数&路径参数 查询参数&#xff1a; URI:/teachers?typeweb GetMapping("/klasses/teachers") public List<Teacher> getKlassRelatedTeachers(String type ) { ... }如果查询参数type与方法的名称相同&#xff0c;则直接将web传入…

学生评教,问卷调查表评价教师统计,python+pandas处理数据

先上一个结果表格 几个关键步骤 1、问卷网站上设置相关题目&#xff0c;条目&#xff0c;最好用评分题目&#xff08;点击文本选项&#xff0c;但是保存下来的是分值&#xff09;&#xff0c;如图 2、pandas清洗数据&#xff0c;包括unstack&#xff0c;其目的是把所有学生得…