记录一次查询优化

一.背景描述

1.1问题和情况

  1. 生产环境,有一张按每天一份数据的表(下面简称表1),跨天查询较慢,跨月查询甚至超时
  2. 查询一天内的数据速度不怎么慢
  3. 查询是分页的
  4. 表1按照日期做了子分区,一个月一个子分区

1.2造成问题的原因

  1. 生产环境 数据库本身问题,性能不佳
  2. 表1的数据每天增加8万条
  3. 表1还有往年历史数据,数据体量有3、4千万,更使得查询变慢。

二.优化思路

2.1针对问题考虑

考虑到造成查询较慢的原因主要有两个,一个是表的数据量较大,第二个是跨天或者跨月可能导致跨分区查询。第一个无法改变, 第二个可以从查询上优化

2.2优化思路

如果能确认此次查询页的数据,属于查询日期范围的哪一 天,那么也就只需要去一个分区中拿数据(最坏情况也只是两个分区),而不是带着原时间范围查询。查询效率也会得到提升。

2.3优化前提

优化思路中的意思就是,比如现在是查询2024.10.1-2024.10.03日期范围内的数据,分页数是20,当前第3页,10.1号201条数据,10.2号180条数据,10.3号200条数据,那么第3页的数据肯定还在10.1号这天内,那就正常查询时间范围是10.1号的数据,如果现在到了第11页,11*20=220>201,这就说明第11页的数据要从10.1号的数据取1条,从10.2号的数据中取19条。由此可以得知,优化前提是:当前页面分页数要小于查询时间范围最小的数据,要不然优化没有意义。

因为如果分页是200,一天也就50条数据左右,那肯定会跨天。

优化前后的简化对比图:

2.4优化实现

  1. 根据用户的查询条件,查出每个日期有多少数据,得到数据总数,进而得到总的分页数。比如查10.1-10.3,10.1号122条,10.2号131条,10.3号98条,那么数据总数是351条,每页20条,共18页。分组共3组,分组下标分别是0,1,2
  2. 计算本次分页查询,需要从第1步返回的数据的第几组-第几组(下标)取元素。比如现在查询第6页,每页20条,那么查询的数据在第1组,如果查询第7页,那么查询的数据分布在第组和第2组,第1组要拿2条,第2组要拿18条
  3. 根据页面实际的开始下标和每页大小,以及第 2 步算出来的分组下标,计算出此次真正需要去 DB 中查询的起止下标(要查询的总数,可能会存在跨天的情况,所以这里会返回一个列表),比如上面的例子,如果是第6页,就查询时间范围是10.1,分页数是第100和120,如果是第7页,就查询时间范围是10.1,分页数是120到122,和,时间范围是10.2,分页数是1到18的三个月还有
  4. 将第 3 步得到的下标列表,按原有 sql 进行查询,最后将数据合并返回。比如上面的例子,就是查2遍。
举个栗子(不跨天的情况):
页面现在查询条件,查询第: pageOffset=3900 pageSize=20 (默认),查询 2024-09-12  2024-09-13 的数据
1. 根据查询条件查询到每天的数据是: 2024-09-12 78010 2024-09-13 79111
2. 将前端传 pageOffset=3900 pageSize=20 以及查询总数 (78000+79111), 可以知道用户要的数据就在第 1 步中的列表的 0-1 (下标)。
3. 根据页面实际对应的下标是 77980-78000 ,第 2 步计算出的 0-1 (下标)以及第 1 步的日期对应的数据,可以计算出真正的查询条件是日期: 2024-09-12 ,下标:77980-78000
其实数据本来也是按日期前后分布在DB中(可以认为是前后放的),原来的查询是前端传了什么时间范围就查什么时间范围,而且可能也没有按日期order by,可能是按id order by,因为这种方式,按不按日期order by都没什么差别,改成查指定日期的数据,就相当于从前往后顺序拿数据
下面是一个示意流程图:
关键点在于怎么判断是否跨天: 看当前页的数据,是否超过了前面分组数的和。还是上面的例子:第6页,拿20条,到120了,第一个分组10.1有 122条,没超过,所以还是从第一个分组拿,到了第7页,拿20条,到120了,而第一个分组10.1只有122条,不够啊。所以还要从第二个组分组拿。同理到了13页,到260了,第一个分组10.1加第二个分组10.2才253条,不够,所以还要从第三个分组取数据。

三.优化前

跨天查询要10秒左右

四.优化后

跨天查询3秒左右

五.思考和心得体会

  1. 作为程序员还是要有一定的算法功底,这里就是针对生产实际问题和特点运用的很简单的算法,从而优化,这一点确实还不足,因为这个思路是领导提的,当时我并没有意识到
  2. 可以看到sql优化,如果跟时间范围有关,那缩小时间范围肯定是可以考虑的

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

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

相关文章

【网络安全 | 漏洞挖掘】逻辑漏洞+无限制爆破实现业务瘫痪

未经许可,不得转载。 文章目录 前言正文前言 目标:target.com,是一个为设计团队服务的工作平台。 该程序允许用户创建账户并组建团队,指定的领导者担任管理员。团队类型包括: 1、免费团队:限于一个项目,最多三份文件。 2、学生团队:项目和文件无限制,学生可免费获…

头歌C语言数据结构课程实验(栈的应用)

第1关:利用栈实现整数的十进制转八进制 本关必读 栈是基础的数据结构,元素操作遵循后进先出的原理。本关卡基于数组存储实现了栈的基本操作。 该方案将栈存储在一片连续空间里,并通过data、top和max三个属性元素。组织成为一个结构&#xf…

Java | Leetcode Java题解之第521题最长特殊序列I

题目: 题解: class Solution {public int findLUSlength(String a, String b) {return !a.equals(b) ? Math.max(a.length(), b.length()) : -1;} }

机器学习、深度学习和强化学习的区别

在当今的人工智能领域,机器学习、深度学习和强化学习是三个重要的概念,它们各自有着独特的特点和应用场景。下面我们来详细了解一下这些概念的区别。 一、定义和基本原理 机器学习:是一种让计算机通过数据学习和发现规律的方法。它使用各种…

《使用Gin框架构建分布式应用》阅读笔记:p212-p233

《用Gin框架构建分布式应用》学习第12天,p212-p233总结,总22页。 一、技术总结 1.JavaScript知识点 (1)class、method (2)function, arrow function, (3)fetch() (4)Promise, then() 2.bootstrap 第5章主要涉及前端技术的运用,作为后…

音视频入门基础:FLV专题(19)——FFmpeg源码中,解码Audio Tag的AudioTagHeader,并提取AUDIODATA的实现

一、引言 从《音视频入门基础:FLV专题(18)——Audio Tag简介》可以知道,未加密的情况下,FLV文件中的一个Audio Tag Tag header AudioTagHeader AUDIODATA。本文讲述FFmpeg源码中是怎样解码Audio Tag的AudioTagHead…

NVR录像机汇聚管理EasyNVR多个NVR同时管理融合汇聚管理系统

流媒体视频融合与汇聚管理系统能够实现对各类模块化服务的统一管理和配置,整合、管理和共享应用服务,并通过标准接口为业务平台和其他第三方平台提供便捷的数据调用功能。为确保该系统的成功实施和稳定运行,在建设方案中除了考虑基础的架构设…

一七一、React性能优化方式

在 React 中进行性能优化可以通过多种手段来减少渲染次数、优化渲染效率并减少内存消耗。以下是常见的性能优化方法及示例: 1. shouldComponentUpdate shouldComponentUpdate 是类组件中的生命周期方法,它可以让组件在判断是否需要重新渲染时&#xff…

@DeleteMapping和@PostMapping和@GetMapping和Content-Type使用记录

代码例子,有注释大家可以自己试一下 RestController RequestMapping(value "demo") public class TestController {//Content-Type:application/x-www-form-urlencoded;表单提交form-dataPostMapping("/demo1")public String test…

服务器的免密登录和文件传输

在天文学研究中,通常会采用ssh登录服务器,把复杂的计算交给服务器,但是如果你没有进行额外的配置,那么登录服务器,以及和服务器进行文件传输,每次都要输入账号和密码,比较不方便,Win…

挑战Java面试题复习第3天,无人扶我青云志

挑战第3天 Java 创建对象有几种方式?有没有可能两个不相等的对象有相同的hashCode深拷贝和浅拷贝的区别final有哪些用法static有哪些用法3*0.1 0.3 返回值是什么aab与ab有什么区别try catch finally,try里有 return,finally还执行么 Java 创…

【Nas】X-Doc:jellyfin“该客户端与媒体不兼容,服务器未发送兼容的媒体格式”问题解决方案

【Nas】X-Doc:jellyfin“该客户端与媒体不兼容,服务器未发送兼容的媒体格式”问题解决方案 当使用Jellyfin播放视频时出现“该客户端与媒体不兼容,服务器未发送兼容的媒体格式”,这是与硬件解码和ffmpeg设置有关系,具体…

沪深A股上市公司数据报告分析

数据分析报 目录 数据分析报告 1.引言 1.1 背景介绍 1.2 报告目的 1.3 报告范围 1.4 关键术语定义 2. 数据收集与预处理 2.1 数据来源概述 2.2 数据收集过程 2.3 数据预处理步骤 3. 数据可视化 3.1分析地区对公司数量的影响 3.2分析行业分类是否影响公…

Mysql当中的各种log

一、MySQL日志文件类型 重做日志(redo log)回滚日志(undo log)二进制日志(binlog)错误日志(errorlog)慢查询日志(slow query log)一般查询日志(g…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-29

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-29 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-29目录1. Does your LLM truly unlearn? An embarrassingly simple approach to recover unlearned knowledge摘要研究背景问题…

Java 22新特性概述

Java 22于2024年3月19日发布,共有12个特性,本节就介绍其中相对重要的9个特性: JEP 447:Statements before super(...) (Preview)super(...) 之前的语句(第一次预览) JEP 454&#x…

C1.【C++ Cont】准备

目录 1.平台 2.Dev C的使用方法 1.新建项目 2.几个常用按钮 3.修改字体 3.第一个C程序:打印Hello World! 4.注 1.平台 Dev C,VS2022 2.Dev C的使用方法 1.新建项目 选择Console Application控制台应用程序,C项目 项目的后缀dev 默认下创建了一个main.cpp,cpp为c源程…

uniapp编译多端项目App、小程序,input框键盘输入后

项目场景: uniapp编译后的小程序端,app端 在一个输入框 输入消息后,点击键盘上的操作按钮之后键盘不被收起,点击其他发送按钮时,键盘也不被收起。 问题描述 在编译后的app上普通的事件绑定,tap,click在发…

pip命令行安装pytest 一直报错

其实就是切换不同镜像安装 我最终成功的是阿里云镜像 pip install --trusted-host mirrors.aliyun.com pytest 也可以用其他的 pip install -i https://pypi.org/simple pytest # 或者使用其他的镜像源 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pytest

版本管理工具切换 | svn切换到gitlab | gitblit 迁移到 gitlab

1.在能够访问SVN服务的电脑上安装 Git-2.47.0-64-bit.exe(下载地址: https://github.com/git-for-windows/git/releases/download/v2.47.0.windows.1/Git-2.47.0-64-bit.exe 如果已安装其它版本可以忽略,但是版本必须大于Git 1.6.0&#xff…