当前位置: 首页 > news >正文

MySQL调优笔记——慢SQL优化记录(2)

        今天调优的原因是,有一个统计报表业务,查询的时间太慢;同时由于数据库的压力是随机性的,这个业务的执行下限和上限相差近20倍;快的时候可以达到600ms,慢的时候有9秒之多;

        接下来详细介绍:这是一个报表业务,按照设备ID统计设备在一段时间内的异常(业务逻辑判断)订单总数;他的数据生成是定时任务每小时查询订单表,并按照一定的业务逻辑判断为异常订单统计单个设备在这段时间范围内异常订单总数的;

        SQL大致是这样的:

    SELECT t1.gun_id,sum(total_count) total_countFROM order_exception t1 where is_deleted = 0 and start_date > '2023-04-01 00:00:00' and start_date < '2023-04-07 23:59:59' group by gun_id order by concat(pile_sn,gun_id) asc

        我们的前端报表是每页10行,分页查询;

        这里就出现了第一个优化点,由于我们使用的是mybatis-plus框架,在使用自动分页功能查询数据的时候,他会自动在外面套上查询总数的语句,以计算出一共有多少页;

        像这样:

SELECT COUNT(1) NUM from (你的业务SQL) 

        这样做的话,会导致这个统计语句被执行两次,在数据量大的情况下就很慢;

        我们初步优化一下,由于每页仅可查看10条数据,但是这个聚合的汇总统计语句计算出的是该段时间内所有设备的总异常订单数量,因此我们需要缩小查询的范围:

        1. 使用DISTINCT语句,计算出该统计表中符合查询条件的设备ID,因为在这个业务中每个设备就是一行数据,所以这里查询到的设备数就是该业务报表的总行数;和原SQL的分页逻辑一致;

        2. 在经过一个查询设备ID的分页SQL之后,可以得到需要在该页展示的设备ID,因此使用IN语句去查询这些设备的异常订单数,查询的范围就大大降低了,效率提升明显,不过这里一定别忘了加上设备id的这个索引;修改之后像下面这样子:

SELECT t1.gun_id,sum(total_count) total_count
FROM order_exception t1 where is_deleted = 0 and start_date > '2023-04-01 00:00:00' and start_date < '2023-04-07 23:59:59' and gun_id in 
(
1367069347104690178,
1367069418131034114,
1367069451580608514,
1368462285101600770,
1368462416299429889,
1368462497148833794
)

        这样修改后,查询时间从5秒降低到了0.5秒,这其中还包括查询结果传输到客户端的时间;

修改前后的EXPLAIN执行计划对比:

 很明显扫描的行数rows字段变少了很多;

        最后,由于该表的数据量总是会随着业务量的增长和时间的推移积累越来越多,于是我找产品经理商量了一下,确认了不需要小时频率更新的需求,于是就就将定时任务的执行频率改为每日执行一次;

        经过上面两个步骤的操作之后,SQL的查询范围大大减少,然后该表的数据量也是减少了很多,这样整体的报表业务查询速度就提高了很多;这次的优化主要是两个方面,SQL逻辑的优化和业务逻辑的优化,其实第一点还是相对容易想到的,但是第二点一般的开发同学估计不会去主动沟通,简单记录一下

相关文章:

MySQL调优笔记——慢SQL优化记录(2)

今天调优的原因是&#xff0c;有一个统计报表业务&#xff0c;查询的时间太慢&#xff1b;同时由于数据库的压力是随机性的&#xff0c;这个业务的执行下限和上限相差近20倍&#xff1b;快的时候可以达到600ms&#xff0c;慢的时候有9秒之多&#xff1b; 接下来详细介绍&#x…...

二叉排序树的插入和删除操作(python实现)

二叉排序树的插入和删除操作都是在保持二叉排序树特性的前提下进行的。 插入操作&#xff1a; 在二叉排序树中插入一个新节点时&#xff0c;先比较新节点的值和当前节点的值的大小关系&#xff0c;若小于当前节点&#xff0c;则继续在当前节点的左子树中查找&#xff1b;若大…...

算法记录 | Day35 贪心算法

860.柠檬水找零 思路&#xff1a; 只需要维护三种金额的数量&#xff0c;5&#xff0c;10和20。 有如下三种情况&#xff1a; 情况一&#xff1a;账单是5&#xff0c;直接收下。情况二&#xff1a;账单是10&#xff0c;消耗一个5&#xff0c;增加一个10情况三&#xff1a;账…...

coinex // 撮合引擎 逻辑流程 (两种数据源 初始化源和前端源)

目录 1 生产者 数据源 1.1. match-server 一启动 初始化数据 自动查询数据库 查询level2要展示的数据 1.2 match-server接收 前端发给Exchange-server的数据 2. 将查询/接受的数据EntrustOrder 转成 Order 解耦 过滤掉不要的属性 3.Order转成 OrderEvent 4. 分配序号发布…...

CentOS7---部署LNMP数据存储到redis

一、部署LNMP及redis 1、部署LNMP&#xff0c;需要将 tengine-2.2.0.tar.gz 拷贝到虚拟机的 /root 目录下 步骤一&#xff1a;安装nginx 源码安装相关软件包 # pcre-devel做正则匹配&#xff0c;zlib-devel做数据压缩 [roottemplate ~]# yum -y install gcc pcre-devel zlib-de…...

Linux中的git命令行

Linux中的git命令行 目录 Linux中的git命令行引入1、Linux下的git工具起源2、gitee的使用.gitignore.git 3、git三板斧3.1 git add3.2 git commit3.3 git push 4、git操作4.1 查看提交日志4.2 查看状态4.3 远端同步4.4 删除文件4.5 修改文件名 引入 当多个开发者同时参与同一个…...

【C++】哈希表:开散列和闭散列

&#x1f4dd; 个人主页 &#xff1a;超人不会飞)&#x1f4d1; 本文收录专栏&#xff1a;《C的修行之路》&#x1f4ad; 如果本文对您有帮助&#xff0c;不妨点赞、收藏、关注支持博主&#xff0c;我们一起进步&#xff0c;共同成长&#xff01; 目录 前言一、基于哈希表的两个…...

C技能树:Hello World

Hello World 输出 "Hello, World!" 字符串&#xff0c;请选出错误答案。 小知识&#xff1a;Hello World究竟从何而来? Hello, World最早是由 Brian Kernighan 创建的。1978年&#xff0c;Brian Kernighan写了一本名叫《C程序设计语言》的编程书&#xff0c;在程…...

TryHackMe-Set(Windows渗透测试 | WinDefender免杀)

Set 您再次发现自己在Windcorp公司的内部网络上。上次你去那里的味道真好&#xff0c;你回来了 了解更多。 但是&#xff0c;这次他们设法保护了域控制器&#xff0c;因此您需要找到另一台服务器&#xff0c;并在第一次扫描时发现“Set”。 Set被用作开发人员的平台&#xf…...

信安大佬真的用kali吗?

Kali只是现在网络安全和kali比较火的一个操作系统 下面我为大家讲讲kali系统都有那些优点 Kali介绍Kali Linux是基于Debian的Linux发行版&#xff0c; 设计用于数字取证操作系统。面向专业的渗透测试和安全审计。 集成化&#xff1a;预装超过300个渗透测试工具兼容好&#x…...

禁用表单元素:Layui框架下的实践与技巧

引言 在日常的网页开发过程中&#xff0c;有时我们需要禁用表单元素&#xff0c;以防止用户在某些情况下进行输入或更改。在本文中&#xff0c;我们将介绍如何在Layui框架下使用JavaScript禁用表单元素&#xff0c;例如单选按钮&#xff08;radio&#xff09;、下拉列表&#…...

spring boot 访问HTML

HTML整合spring boot 简介默认文件路径访问自定义文件路径访问 或通过Controller控制器层跳转访问 简介 SpringBoot默认的页面映射路径&#xff08;即模板文件存放的位置&#xff09;为“classpath:/templates/*.html”。静态文件路径为“classpath:/static/”&#xff0c;其中…...

WPF教程(四)--Dispatcher

一、Dispatcher介绍 微软在WPF引入了Dispatcher&#xff0c;那么这个Dispatcher的主要作用是什么呢&#xff1f; 不管是WinForm应用程序还是WPF应用程序&#xff0c;实际上都是一个进程&#xff0c;一个进程可以包含多个线程&#xff0c;其中有一个是主线程&#xff0c;其余的是…...

ijkplayer 编译增加支持更多的音视频格式

ijkplayer是B站开源的一款基于ffmpeg的移动端播放器。但为了减少播放器的体积&#xff0c;很多音视频的格式播放默认都是不支持的&#xff0c;需要自己下载ijkplayer源码进行编译。这里以mac环境下android为例&#xff0c;简述ijkplayer的编译过程&#xff0c;以及为了支持更多…...

TOP命令显示完整命令行信息

TOP 在Linux系统中&#xff0c;可以使用top命令来查看系统的实时性能数据&#xff0c;包括CPU使用率、内存使用率、进程信息等。以下是top命令的常用选项&#xff1a; -d seconds&#xff1a;指定top命令的刷新时间&#xff0c;单位为秒。 -u username&#xff1a;只显示指定…...

Spring6从入门到精通 第一章 带你玩转Spring

这里写目录标题 一 Spring框架产生的原因二 Spring6配置的关键环节 一 Spring框架产生的原因 传统的JavaWeb存在着耦合度较高的问题&#xff0c;而且实现完整的的MVC三层架构&#xff0c;开发成本过大&#xff0c;因此出现了Spring这个轻量级的开发框架&#xff0c;相当于建筑里…...

Apache POI 实现用Java操作Excel完成读写操作

简介 Apache POI是一个用于操作Microsoft Office格式文件&#xff08;包括xls、docx、xlsx、pptx等&#xff09;的Java API库。POI全称为Poor Obfuscation Implementation&#xff0c;是Apache Software Foundation的一个开源项目。它提供了一组Java API&#xff0c;使得Java程…...

改善供应商关系的八种方法

与供应商保持良好关系的重要性有很多原因。最重要的是&#xff0c;它使每个人的日常工作更加愉快。它还可以为你获得更好的交易&#xff0c;有助于协作并增强商誉。 但是&#xff0c;每个供应商都是不同的&#xff0c;建立牢固的关系可能很棘手。本文将解释企业如何建立并操持…...

网络安全-CDN绕过寻找真实IP

网络安全-CDN绕过寻找真实IP CDN就是CDN加速&#xff0c;就是根据你的目标让你访问的更快 CDN CDN&#xff0c;即内容分发网络&#xff0c;主要解决因传输距离和不同运营商节点造成的网络速度性能低下的问题。说得简单点&#xff0c;就是一组在不同运营商之间的对接节点上的…...

牛客网 HJ28 素数伴侣【二分图匹配,匈牙利算法】困难

描述 若两个正整数的和为素数&#xff0c;则这两个正整数称之为“素数伴侣”&#xff0c;如2和5、6和13&#xff0c;它们能应用于通信加密。现在密码学会请你设计一个程序&#xff0c;从已有的 N &#xff08; N 为偶数&#xff09;个正整数中挑选出若干对组成“素数伴侣”&am…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...