14 | count(*)这么慢,我该怎么办?

news2024/11/15 5:54:07

一下内容出自《MySQL 实战 45 讲》

14 | count(*)这么慢,我该怎么办?

count(*) 的实现方式

不同的 MySQL 引擎中,count(*) 有不同的实现方式。

  • MyISAM 引擎把一个表的总行数存在了磁盘上,执行 count(*) 的时候会直接返回这个数,效率很高;
  • InnoDB 引擎就执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。

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

即使是在同一时刻的查询,因为 MVCC 的原因,InnoDB 表 “应该返回多少行” 也是不确定的。

InnoDB 在执行 count(*) 操作的优化。

InnoDB 是索引组织表,主键索引树到的叶子节点是数据,而普通索引树的叶子节点是主键值。所以,普通索引树比主键索引树小的多。对于 count(*) , MySQL 优化器会找到最小的那棵树来遍历保证逻辑正确的情况下,尽量减少扫描的数据量,是数据库系统设计的通用法则之一

show table status 命令

image

命令中返回的 Rows 能代替 count(*) 吗?

这个值是采样估算来的,并不准确,官方说误差可能达到 45%~50%。

如何快速获取到表的行数?

从上面的可以得出:

  • MyISAM 表虽然 count(*) 很快,但是不支持事务;
  • show table status 命令虽然返回很快,但是不准确;
  • InnoDB 表直接 count(*) 会遍历全表,虽然结果准确,但会导致性能问题。

如果现在有一个页面经常要显示交易系统的操作记录总数,到底应该怎么办呢?答案是,只能自己计数。

  • 用缓存系统计数
    • 问题:丢失更新(崩溃丢失)、值逻辑上不正确,因为插入数据库和修改内存值并不是原子性的(分布式一致性问题)
  • 数据库保存计数
    • 可以解决崩溃丢失,InnoDB 是支持崩溃恢复不丢数据的。
    • 利用事务,可以保证值逻辑上的一致性。

总结:

​ 不同的存储构成的系统,不支持分布式事务,无法拿到精确一致的视图

​ 把计数值也放在 MySQL 中,就解决了一致性视图的问题。

不同 count 用法

先说结论:按照效率排序的话,count(字段)<count(主键 id)<count(1)≈count(*)

分析性能差别的原则:

1、server 层要什么就给什么;

2、InnoDB 只给必要的值;

3、现在的优化器只优化了 count(*) 的语义为“取行数”,其他“显而易见”的优化并没有做。

count(主键 id)

InnoDB 引擎会遍历整张表,把每一行的 id 值都取出来,返回给 server 层。server 层拿到 id 后,判断是不可能为空的,就按行累加。

count(1)

InnoDB 引擎遍历整张表,但不取值。server 层对于返回的每一行,放一个数字“1”进去,判断是不可能为空的,按行累加。

单看这两个用法的差别的话,能对比出来,count(1) 执行得要比 count(主键 id) 快。因为从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。

count(字段)

1、如果这个“字段”是定义为 not null 的话,一行行地从记录里面读出这个字段,判断不能为 null,按行累加;

2、如果这个“字段”定义允许为 null,那么执行的时候,判断到有可能是 null,还要把值取出来再判断一下,不是 null 才累加。

count(*)

专门做了优化,不取值。count(*) 肯定不是 null,按行累加。

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

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

相关文章

斯坦福大学吴佳俊:通过自然监督编码理解视觉世界

导读 在智源大会的生成模型论坛上&#xff0c;斯坦福大学助理教授吴佳俊带来了精彩的演讲 “通过自然监督编码理解视觉世界”&#xff08;Understanding the Visual World Through Naturally Supervised Code&#xff09;。此次演讲从二维图像拓展到三维世界&#xff0c;从人类…

linux高并发网络编程开发(xml json)16_xml和Json相关api及文件解析制作

pdf详细版 01 学习目标 xml xml基础语法和规范C程序中如何使用xml开源库借助开源库,在C程序中生成xml文件已知一个xml文件,如何借助开源库解析xml文件数据 Json json的基础语法和规范C程序中如何使用json开源库 - cjson使用cjson生成json文件已知一个json文件,使用cjson库解析…

列存储、行存储

一、定义 1.1定义 Sybase在2004年左右就推出了列存储的Sybase IQ数据库系统,主要用于在线分析、数据挖掘等查询密集型应用。列存储&#xff0c;缩写为DSM&#xff0c;相对于NSM(N-ary storage model)&#xff0c;其主要区别在于&#xff1a; DSM将所有记录中相同字段的数据聚…

【AUTOSAR】BMS开发实际项目讲解(二十三)----电池管理系统高压互锁保护

高压互锁保护 关联的系统需求 TSR-BMS-6101、TSR-BMS-6102、TSR-BMS-6103、TSR-BMS-6104、TSR-BMS-6105、TSR-BMS-6106、TSR-BMS-6107、TSR-BMS-6108、TSR-BMS-6109、TSR-BMS-6110、TSR-BMS-6111; TSR-BMS-6201; TSR-BMS-6301; TSR-BMS-S101、TSR-BMS-S102、TSR-BMS-S103、TS…

AutoSAR系列讲解(入门篇)4.3-BSW的Communication功能

一、架构与术语解释 BSW中以后每一节我都会放上一张模块图&#xff0c;所以就先上图&#xff1a; 由于汽车上一般都使用CAN总线&#xff0c;图中的bus大家可以就当成CAN来看待&#xff0c;如果使用的是LIN或者其他的&#xff0c;也相应的换成其总线看待就行。后续在实践篇中将会…

你需要了解的 50 个 ChatGPT 统计数据和事实

Rest assured that with the ChatGPT statistics you’re about to read, you’ll confirm that the popular chatbot from OpenAI is just the beginning of something bigger. Since its launch in November 2022, ChatGPT has broken unexpected records. For example, it r…

数据结构之串

1.串的基本概念 • 一个串是由n&#xff08;n≥0&#xff09;个字符组成的有限序列&#xff0c;记为s“s0s1 ⋯ sn-1”&#xff0c;其 中&#xff0c;s是串名&#xff0c;双引号括起来的字符序列s0s1 ⋯ sn-1是串值。 • 一个字符在串中的位置称为该字符在串中的序号&#xff…

微搭低代码实现表单打印功能

目录 1 引入第三方库2 搭建页面3 实现打印4 实现效果总结 在我们的日常开发场景中&#xff0c;表单打印是一个比较常见的场景&#xff0c;微搭本身不带打印功能&#xff0c;我们需要借助一个第三方的库来实现打印。 1 引入第三方库 在微搭中如果需要引入第三方库的&#xff0…

阿里云免费云服务器领取教程

阿里云推出了免费试用中心&#xff0c;提供超百款免费试用云产品&#xff0c;个人用户与企业用户均可免费试用&#xff0c;云服务器最长免费体验3个月&#xff01; 一、活动地址 阿里云免费试用中心 二、活动对象 满足以下全部条件的阿里云用户&#xff1a; 1、阿里云注册会…

JS模块化规范及进化史

模块化规范及进化史 按照功能和需求分成各个模块&#xff0c;最后再把所有模块合并在一起。当然现在基于webpack vue/react&#xff0c;模块化开发很重要。某个功能板块单独写成一个模块&#xff0c;然后把模块合在一起&#xff0c;最后把整个页面的功能实现。方便团队管理 小插…

stunnel-加密通道-squid-IP缓存服务器-openssl自签名证书

文章目录 1.安装squid2.管理squid服务3.安装Stunnel服务器端4.安装Stunnel客户端5.在目标使用位置开启代理 1.安装squid yum install squid 2.管理squid服务 systemctl start squid systemctl stop squid systemctl status squid 查看端口 netstat -lntpo | grep 8**** 修改配…

集成增益采样电路误差计算--适用INA214

一、 一般集成电路结构如下&#xff1a; 二、 典型的计算步骤如下&#xff1a; 主要误差来源&#xff1a;采样电阻R-shunt&#xff0c;集成增益运放&#xff0c;ADC误差。 采样电阻误差 误差项包括常温下电阻的精度X1%&#xff0c;电阻的温漂值X2% 误差百分比为&#xff1a;…

《C++ Primer》--学习11

关联容器中的元素是按关键字来保存和访问的 两个主要的关联容器类型是 map 和 set。map 中的一个关键字-值&#xff08;key - value&#xff09;对&#xff1a;关键字起到索引作用&#xff0c;值则表示与索引相关联的数据。set 中每个元素只包含一个关键字&#xff1b; 以下八…

Java-数据结构(一)

这里写目录标题 前言一、为什么需要数据结构&#xff1f;1、低效的操作2、占用过多的内存空间3、困难的数据操作 二、枚举&#xff08;Enumeration&#xff09;1、定义2、关键字3、适用场景 三、 位集合&#xff08;BitSet&#xff09;1、定义2、方法3、适用场景 四、向量&…

文件操作 -- C语言

在之前学习的时候&#xff0c;我们可以发现当程序运行完&#xff0c;我们之前保存的数据就会消失&#xff0c;再次运行时还得重新输入&#xff0c;为了使我们保存的数据在下次运行时还能使用&#xff0c;我们这篇文章来学习一下怎么使用文件操作&#xff0c;将我们的数据保存在…

SQL14 操作符混合运用

select device_id,gender,age,university,gpa from user_profile where university山东大学 and gpa>3.5 or university复旦大学 and gpa>3.8;

Linux 抓包工具——tcpdump

1 简介 用简单的话来定义tcpdump&#xff0c;就是&#xff1a;dump the traffic on a network&#xff0c;根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口…

由浅入深探究mysql索引结构原理、性能分析与优化

目录 第一部分&#xff1a;基础知识 第二部分&#xff1a;MYISAM和INNODB索引结构 1、 简单介绍B-tree B tree树 2、 MyisAM索引结构 3、 Annode索引结构 4、 MyisAM索引与InnoDB索引相比较 第三部分&#xff1a;MYSQL优化 1、表数据类型选择 2、sql语句优化 3、系统配置与维护…

Java对称与非对称加密解密(AES与RSA)

尽可能预想所有残酷的可能性、因为现实永远让你无法预警,而且又吝于给人慈悲。——富坚义博 今天我们讨论一下秘钥这个东西 一、对称加密技术与非对称加密技术简述 加密技术可以分为对称与非对称两种。 对称加密、解密即加密与解密用的是同一把秘钥,常用的对称加密技术有DES,A…

MySQL - 连表查询 Join On 详解

1. 连表查询详解 市面上有 7 种连表查询, 总共归为三大类 : 左查询 LEFT JOIN -- 以左表为基准右查询 RIGHT JOIN -- 以右表为基准交叉查询 INNER JOIN -- 查询两表都有的数据 操作描述inner join如果表中至少有一个匹配, 就返回行left join会从左表中返回所有的值…