『MySQL 实战 45 讲』14 - count(*) 慢的根本原因

news2025/1/20 5:56:10

count(*) 慢的根本原因

count(*) 的实现方式

  1. MyISAM 引擎会把一个表的总行数存在了磁盘上
  2. InnoDB 引擎需要把数据一行行读出,累计计数

为什么 InnoDB 不跟 MyISAM 一样,也把数字存起来呢

  1. 由于多版本并发控制的原因(和快照读有关系),即同一时刻存在多个查询,InnoDB 表返回多少行不确定
  2. 例如三个用户对 A、B、C 并行开启事务会话,结构都不一样
  • 会话 A 先启动事务并查询一次表的总行数
  • 会话 B 启动事务,插入一行后记录后,查询表的总行数
  • 会话 C 先启动一个单独的语句,插入一行记录后,查询表的总行数
    在这里插入图片描述
  1. MYSQL 对 count(*) 操作,仍然做了优化
  • MySQL 优化器会找数据量少的索引树(包括主键、普通索引树比较)来遍历获取结果
  1. 不要使用下面命令来获取行数,其中的 TABLE_ROWS 字段是统计索引值,不准确
show table status

不同的 count 用法

  1. 首先明确,count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1,否则不加
  2. 对于 count(主键 id) 、 count(1) 、 count(字段)、count(*) 的性能分析
  • count(主键 id)
    • 会遍历整张表,把每一行的 id 值都取出来,返回给 server 层。server 层拿到 id 后,判断是不可能为空的,就按行累加
  • count(1)
    • 遍历整张表,但不取值。server 层对于返回的每一行,放一个数字 “1” 进去,判断是不可能为空的,按行累加
  • count(字段)
    • 如果这个 “字段” 是定义为 not null 的话,一行行地从记录里面读出这个字段,判断不能为 null,按行累加
    • 如果这个 “字段” 定义允许为 null,需要判断累加
  • count(*)
    • 做了专门优化,不取值。count(*) 肯定不是 null,按行累加
  1. 效率排序
count(字段)<count(主键 id)<count(1)≈count(*)

解决方案

  1. 用缓存系统保存计数
  • 使用 Redis 服务保存这个表的总行数
    • 这个表每被插入一行 Redis 计数就加 1,每被除一行 Redis 计数就减 1
    • 然后把总行数定期地持久化存储起来
  • 如果 Redis 异常重启以后,则到数据库里面单独执行一次 count(*) 获取真实的行数,然后把值写回到 Redis 里
  • 注意: 将计数保存在缓存系统中的方式,还不只是丢失更新的问题。即使 Redis 正常工作,这个值还是逻辑上不精确的
  1. 在数据库保存计数
  • 计数直接放到数据库里单独的一张计数表 C 中
  • 如果有时序问题,就用事务来查表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/523007.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

APP 兼容性测试是什么?8年测试老鸟告诉你

1、APP 兼容性测试认识 随着 APP 应用范围越来越广&#xff0c;用户群体越来越大&#xff0c;终端设备的型号也越来越多&#xff0c;移动终端碎片化加剧&#xff0c;使得 APP 兼容性测试成为测试质量保障必须要考虑的环节。 APP 兼容性测试通常会考虑&#xff1a;操作系统、厂…

Golang每日一练(leetDay0065)

目录 191. 位1的个数 Nnumber of 1-bits &#x1f31f; 192. 统计词频 Word Frequency &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 191. 位1的个数 Nnum…

《编程思维与实践》1070.复数幂

《编程思维与实践》1070.复数幂 题目 思路 思路比较简单,就是细节比较繁琐: ( a b i ) ( c d i ) ( a c − b d ) ( a d b c ) i (abi)(cdi)(ac-bd)(adbc)i (abi)(cdi)(ac−bd)(adbc)i , 利用该公式分实部和虚部进行计算结果即可. 由于涉及加减和正负号,所以在大整数结构…

MySQL的事务

1、事务的概念 事务是一种机制、一个操作序列&#xff0c;包含了一组数据库操作命令&#xff0c;并且把所有的命令作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这一组数据库命令要么都执行&#xff0c;要么都不执行。 事务是一个不可分割的工作逻辑单元&#xff…

【python数据分析】Pandas数据载入

&#x1f64b;‍ 哈喽大家好&#xff0c;本次是python数据分析、挖掘与可视化专栏第五期 ⭐本期内容&#xff1a;Pandas数据载入 &#x1f3c6;系列专栏&#xff1a;Python数据分析、挖掘与可视化 &#x1f44d;“总有一段时光悄悄过去然后永远怀念.” 文章目录 前言一、数据载…

fusion app 网页远程控制app

拥有此网页&#xff0c;即可。远程控制软件里面的公告更新以及其他内容。 网页并无联系方式&#xff0c;请自己摸索。 从此即可摆脱&#xff0c; QQ收藏&#xff0c;微云&#xff0c;讯飞语记的束缚&#xff01; 使用本程序网站放再多的内容都不会乱码&#xff01; FA2和1都可…

代码随想录算法训练营第四天|24. 两两交换链表中的节点 、19.删除链表的倒数第N个节点 、面试题 02.07. 链表相交 、142.环形链表II

两两交换链表中的节点 题目链接&#xff1a;力扣 解题思路&#xff1a;虚拟头节点&#xff0c;然后进行模拟即可。 我拿到这道题的时候&#xff0c;其实交换的思路是有的&#xff0c;但是首先没有设虚拟节点&#xff0c;这使得我的解答很乱&#xff0c;有很多if条件判断。其次…

Eclipse中如何使用:Maven、Git、GitHub、码云

第1章 在Eclipse 中使用 Maven 1.1 安装 Maven 核心程序 1)下载地址&#xff1a;http://maven.apache.org/ 2)检查 JAVA_HOME 环境变量。Maven 是使用 Java 开发的&#xff0c;所以必须知道当前系统环境中 JDK 的安装目录。 即&#xff1a;安装jdk目录中bin目录的上一级目录…

基于ESP32的单通道LoRaWAN网关设计资料介绍-操作模式

资料下载链接》》 介绍 这是在由ESP8266/ESP32 mcu和sx1276无线电组成的平台上实现LoRa网关功能的第6代软件。与旧版本的网关不同&#xff0c;此版本将在单一频率上收听所有可用的扩频因子 (SF)。网关使用 Web 功能&#xff08;通过 Intranet&#xff09;启用网关的监控和配置…

桂院导航小程序 云开发项目 二次开发教程

Gitee代码仓库&#xff1a;桂院导航小程序 GitHub代码仓库&#xff1a;GLU-Guide​​​​​​​ 演示视频 桂院校园导航小程序 演示视频 先 假装 大伙都成功安装了云开发项目&#xff0c;并能在 微信开发者工具 和 手机 上正确运行。 接着就是 将项目 改成自己的学校。 代码…

Redis性能测试怎么做?看看字节8年测试工程师写的测试总结

最近测试服务端的时候,接触到了redis&#xff0c;之前也看过,但不系统,借着这次实践,记录一下 01、简介 Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 它通常被称为数据结构…

【Linux】第一个驱动程序,hello world!开启驱动之旅

目录 前言&#xff1a; 一、背景 二、驱动程序编写流程 1.APP打开的文件在内核中如何表示&#xff1f; 2.编写驱动程序的流程 三、hello驱动程序实战 hello_drive.c hello_drive_test.c 最终测试&#xff1a; a.首先编译内核&#xff08;如果没有编译过&#xff09…

Makefile 与 docker 进行多服务 一次性构建

本机多服务一次性构建背景 本机开发多个服务,每个服务还会互相调用正常情况,开发者需要在本地启动多个服务,并且手动调用想着不使用gitlab ci/cd, 在本机快速通过 makefiledocker-compose 编排多个服务可执行源码在:https://github.com/webws/go-moda/tree/main/example/traci…

使用Segment Anything(SAM)模型进行自动标注

1.下载项目 项目1&#xff1a;https://github.com/zhouayi/SAM-Tool 项目2&#xff1a;https://github.com/facebookresearch/segment-anything git clone https://github.com/zhouayi/SAM-Tool.gitgit clone https://github.com/facebookresearch/segment-anything.git cd …

Nginx之正向代理与反向代理

1.什么是代理 打工人张三最近换了新工作&#xff0c;原来的住房离公司的路程太远&#xff0c;于是乎想要重新找一个离工作地不那么远的住房&#xff0c;由于工作繁忙&#xff0c;没有时间看房。 房东王五名下有2套住房&#xff0c;一套自己住&#xff0c;另一套想租出去&…

shell脚本----sed命令

文章目录 一、sed的工作流程二、sed的操作三、Sed命令使用3.1打印内容3.2删除行3.3替换3.4插入3.5分组调用 一、sed的工作流程 sed概述 sed编辑器时一种流编辑器&#xff0c;流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 sed编辑器可以根据命令来处理…

(转载)从0开始学matlab(第3天)—多维数组

正如我们所看到的&#xff0c;MATLAB 的数组可能是一维或多维的。一维的数组可以形象地看作一系列的数垂直地罗列起来&#xff0c;用一个下标就可以调用数组中的元素&#xff08;如图 a&#xff09;。这样的数组适用于一个变量的函数&#xff0c;例如在规定的时间间隔后一系列…

C语言实战 - 贪吃蛇(图像界面)

由于本人精力有限&#xff0c;暂时先把素材和代码放上&#xff0c;等以后有空再补教程。 目录 效果预览 准备工作 EasyX图形库 音频素材 代码编写 Transfer.h文件 game.cpp文件 main.c文件 效果预览 先来看一下最终成品效果 贪吃蛇图形界面 准备工作 EasyX图形库 这…

Stable Diffusion云端部署只需三步, 不吃电脑配置, 模型快速部署

牙叔教程 简单易懂 我是小白, 小白跟我一步一步做就可以了, 鼠标点两下就OK了, 学点新东西, 好吗? 不想学的就走吧, 离我远点. Stable Diffusion是什么 Stable diffusion是一个基于Latent Diffusion Models&#xff08;潜在扩散模型&#xff0c;LDMs&#xff09;的文图生成…

瑞吉外卖 - 后台系统登陆功能(3)

某马瑞吉外卖单体架构项目完整开发文档&#xff0c;基于 Spring Boot 2.7.11 JDK 11。预计 5 月 20 日前更新完成&#xff0c;有需要的胖友记得一键三连&#xff0c;关注主页 “瑞吉外卖” 专栏获取最新文章。 相关资料&#xff1a;https://pan.baidu.com/s/1rO1Vytcp67mcw-PD…