MySQL数据库优化————COUNT优化

news2024/9/23 9:31:47

直接进入主题

索引对count语句的影响

在我们对departments表进行count查询时,使用了以下语句

select count(*) from employees;

当前employees表索引情况如图
在这里插入图片描述

只有一个主键索引
执行

explain
select count(*) from employees;

![在这里插入图片描述](https://img-blog.csdnimg.cn/c5b3b99115234070b959a0c4bed05682.png
从结果中可以看到,这时候用的是主键索引。
让我们修改一下employees表的索引
在这里插入图片描述
在last_name上创建了索引,我们再次执行explain得到结果
在这里插入图片描述
我们再一次修改employees表的索引
在这里插入图片描述
我们又在first_name上创建了索引,再一次执行explain语句
在这里插入图片描述
这一次我们用到了first_name上的索引,并且索引长度first_name上的要小于last_name上的。

得到结论:

  • 当没有非主键索引时,count查询会使用主键索引
  • 如果存在非主键索引时,count查询会使用非主键索引
  • 如果存在多个非主键索引时,count查询会使用索引长度最小的非主键索引

原因分析
我们的表使用的InnoDB引擎,那么主键索引存储的是主键+表数据,而非主键索引存储的是索引+主键。InnoDB是以页为单位的,那么存储的一行数据越小,则存储的数据越多。主键的大小是固定的,而表数据的大小肯定比一个非主键索引大,所以非主键索引存储的数据要比主键索引存储的数据量大;同理,长度小的非主键索引存储的数据也比长度大的非主键索引存储的数据量大。

count(字段)和count(*)

当我们在执行count(字段)时

select count(last_name) from employees;

执行explain语句

explain
select count(last_name) from employees;

在这里插入图片描述
得到结论,count(字段)时,只会针对该字段统计,使用这个字段上面的索引(如果有的话)。
在这里插入图片描述
如果我们将last_name上的索引删除,再次执行explain语句
在这里插入图片描述
得到结论,count(字段)时,如果该字段上没有索引,则进行的时全表扫描。
我们分别执行以下语句

select count(*) from employees;

select count(last_name) from employees;

分别得到结果
在这里插入图片描述
在这里插入图片描述
为什么会不一样呢,因为我将其中的四条数据的last_name置为了null;
结论,count(字段)会排除掉该字段值为null的数据,而count(*)不会排除,所以要根据业务需求的需要进行选择,不能无脑的任意选择一种。

count(*)和count(1)

我们来执行一下count(1)的explai语句,得到结果
在这里插入图片描述
发现该语句同样使用的是表的最小长度的非主键索引。同时查阅官方文档,有这样一段话
在这里插入图片描述
所以,count(*)和count(1)是一样的,没有性能差异。

基于存储引擎

在官方文档中还提到了
在这里插入图片描述
如果是用的MyISAM引擎,并且使用的是示例中的语句,查询速度会非常的快,因为该引擎将行数存储到了引擎。该功能是有限制的,必须是没有where条件语句的。
同时,还有这样一段话
在这里插入图片描述
从MySQL8.0.13,InnoDB引擎如果没有where条件,查询也会被优化,性能有所提升。该功能有条件的朋友可以在低版本的MySQL和8.0.13版本上的进行一下验证,这里不做演示。

汇总表

当count查询耗时过长,我们可以创建一张汇总表,统计各个表的行数。当数据发生变化时去修改对应表的行数,可以通过使用触发器自动维护实现。
这种方法的好处就是结果准确,但是需要额外的维护成本。

sql_calc_found_rows

cpunt查询往往伴随着分页查询,在进行分页查询时我们可以使用以下语句

select sql_calc_found_rows * from table limit offset,size;

然后紧接着执行

select found_rows() as 别名;

这样就能很快的返回我们想要的数据了,因为第一条语句在执行完分页查询后,会自动执行count查询。在项目中我们可以这样运用
在这里插入图片描述
这种方式,从8.0.17已经被废弃了,在以后的版本会被删除。
在这里插入图片描述

使用额外的中间件解决

将count的结果定时存入缓存中,这种方式性能比较高,结果比较准确,有误差,但是可以接受,除非在缓存更新阶段有大量的新增和删除。但是缺点就是要引入额外的组件,增加了架构的复杂度及维护成本。

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

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

相关文章

NOIP2014-提高组初赛C语言解析(选择填空题)

第二十届(2014年)全国青少年信息学奥林匹克联赛初赛一、单项选择题(共 20 题,每题 1.5 分,共计 30 分。每题有且仅有一个正确选项)1. 以下哪个是面向对象的高级语言( B )A.汇编语言 B.C C.Fortran D.Basic参…

【opencv源码解析0.4】如何使用cmake来管理项目

如何使用cmake来管理项目 【opencv源码解析0.1】VS如何优雅的配置opencv环境 【opencv源码解析0.2】如何编译opencv库源码 【opencv源码解析0.3】调试opencv源码以及使用cmake来管理项目 前面几篇文章我们都是围绕Visual Studio 2019这个IDE来展开的,IDE为我们做了…

矩阵中的路径-剑指Offer-java深度优先

一、题目描述给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相…

k8s部署mysql+初始化数据

1. 准备工作 1.k8s的前置内容需要提前了解 2.mysql的初始化数据 3.docerk相关知识点需要了解 2. 部署步骤 初始化数据文件准备,准备了nacos的一张表sql脚本,需要修改一点点内容 文件名称:init-nacos.sql 部分内容显示: 主要创建…

潘长江张杰再现狂飙名场面,一般人把握不住

潘长江张杰再现狂飙名场面,一般人把握不住#我们的客栈#高启强#老墨我饿了 在昨晚播出的《我们的客栈》在猜人游戏的环节中,张杰和潘长江商量了一番,决定还原《狂飙》某一名场面,没想到被张维伊一秒猜出,张维伊还说这是…

图像分类竞赛进阶技能:OpenAI-CLIP使用范例

OpenAI-CLIP 官方介绍 尽管深度学习已经彻底改变了计算机视觉,但目前的方法存在几个主要问题:典型的视觉数据集是劳动密集型的,创建成本高,同时只教授一组狭窄的视觉概念;标准视觉模型擅长于一项任务且仅擅长于一项任务,并且需要大…

【QT专栏】QT中实现多线程的四种方式总结(金针菇般细)

目录 一、继承QThread 1,基本概念 2,操作流程 二、继承QObject(推荐) 1,基本概念 2,操作流程 三、继承QRunnable,配合QThreadPool实现多线程 1,外界通信 2,QMet…

SpringSecurity的安全认证的详解说明(附完整代码)

SpringSecurity登录认证和请求过滤器以及安全配置详解说明 环境 系统环境:win10 Maven环境:apache-maven-3.8.6 JDK版本:1.8 SpringBoot版本:2.7.8 根据用户名密码登录 根据用户名和密码登录,登录成功后返回Token数据…

狂神聊Redis复习笔记一

目录目前一个基本的互联网项目!NoSQL 特点Redis 是什么?Redis 能干嘛?特性测试性能基础的知识Redis 是单线程的!Redis 为什么单线程还这么快?五大数据类型Redis-KeyString(字符串)List&#xff…

[软件工程导论(第六版)]第3章 需求分析(复习笔记)

文章目录3.1 需求分析的任务3.2 与用户沟通获取需求的方法3.3 分析建模与规格说明3.4 实体-联系图(E-R图)3.5 数据规范化3.6 状态转换图3.7 其他图形工具3.8 验证软件需求需求分析是软件定义时期的最后一个阶段,需求分析的基本任务是准确的回…

EASYui+C#web

第一步创建一个web应用程序。 选择web应用程序。 第二步选择mvc框架 创建完成项目目录。 如图引入easyui包。 记住复制到content文件夹&#xff0c;否则无法识别。 easyui下载&#xff0c;官网。 如何用 引入jscss文件 <link rel"stylesheet" type"text…

Guitar Pro8手机电脑免费版吉他软件下载

Guitar Pro8是专业的吉他软件&#xff0c;具有可视化的五线谱编辑器&#xff0c;涵盖常用的乐器和特殊乐器单元&#xff0c;内置海量吉他音色效果和1000多个乐器音色&#xff0c;成为一个小型音乐站&#xff0c;制作出动听的音乐&#xff0c;支持边看边听&#xff0c;添加音频轨…

【论文阅读】 Few-shot object detection via Feature Reweighting

Few-shot object detection的开山之作之一 ~~ 特征学习器使用来自具有足够样本的基本类的训练数据来 提取 可推广以检测新对象类的meta features。The reweighting module将新类别中的一些support examples转换为全局向量&#xff0c;该全局向量indicates meta features对于检…

使用MindSpore20.0的API快速实现深度学习模型之数据变换

文章目录前言一. 实验环境二. 安装ubuntu虚拟机2. 1.下载ubuntu镜像2.2 配置虚拟机2.3 安装操作系统三. 安装MindSpore20.0-alpha3.1 下载需要的安装程序脚本3.2 安装MindSpore 2.0.0-alpha和Python 3.73.3 开始手动安装3.4. 安装gcc3. 5.安装MindSpore3.6. 验证是否成功&#…

【opencv源码解析0.3】调试opencv源码的两种方式

调试opencv源码的两种方式 上两篇我们分别讲了如何配置opencv环境&#xff0c;以及如何编译opencv源码方便我们阅读。但我们还是无法调试我们的代码&#xff0c;无法以我们的程序作为入口来一步一步单点调试看opencv是如何执行的。 【opencv源码解析0.1】VS如何优雅的配置ope…

有效提升英语论文写作的方法

这里结合我的一些经验&#xff0c;分享一些练习英语论文写作的方法。 论文是由单词&#xff0c;句子&#xff0c;还有逻辑三部分组成&#xff0c;每个部分的要求都不太一样&#xff0c;这里分成三个部分练习讨论: 1炼词, 2 炼句,3 炼逻辑. 炼词 首先&#xff0c;炼词就是首先…

发布npm库遇到的

&#xff08;1&#xff09;首先首先要检查源是npm还是淘宝镜像源&#xff0c;因为本地设置了淘宝镜像源的原因&#xff0c;会导致npm login出错&#xff0c;需要修改&#xff1a; npm config set registry https://registry.npmjs.org 查看是否修改成功&#xff1a;得到上面源…

SpringCloud - Eureka注册发现

目录 提供者与消费者 Eureka原理分析 搭建Eureka服务 服务注册 服务发现 提供者与消费者 服务提供者&#xff1a; 一次业务中&#xff0c;被其它微服务调用的服务(提供接口给其它微服务)服务消费者&#xff1a; 一次业务中&#xff0c;调用其它微服务的服务(调用其它微服务…

基于jeecgboot的flowable流程增加节点自动跳过功能

为了满足有时候需要在某个节点没有人员处理的时候需要自动跳过&#xff0c;所以增加了这个功能。 一、FlowComment意见里增加一个类型8&#xff0c;跳过流程 /** * 流程意见类型 * */ public enum FlowComment { /** * 说明 */ NORMAL("1", "…

Java8新特性全面

文章目录一、函数式接口二、Java内置函数式接口三、接口内允许添加默认实现的方法四、Lambda表达式五、方法引用六、Stream API七、Stream API示例1. Filter过滤2. Sorted排序3. Map转换4. Match匹配5. Count计数6. Reduce7. Parallel-Streams并行流8. Map集合八、新时间日期接…