记录一次查询优化

一.背景描述

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,一经查实,立即删除!

相关文章

头歌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章主要涉及前端技术的运用,作为后…

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

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

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

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

【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摘要研究背景问题…

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

【339】基于springboot的新能源充电系统

毕 业 设 计(论 文) 题目:新能源充电系统的设计与实现 摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解…

为什么 C 语言数组是从 0 开始计数的?

C 语言等大多数编程语言的数组从 0 开始而不从 1 开始,有两个原因: 第一:地址计算更方便 C 语言从 0 开始的话,array[i] 的地址就正好是: (array i) 如果是从 1 开始的话,就是 (array i - 1) 多一次计…

`map` 是 JavaScript 数组的一个高阶函数,用于对数组中的每个元素进行操作,并返回一个新的数组

文章目录 map 方法的作用语法示例 具体到你的代码完整代码片段总结 当然可以解释一下 map 方法的作用。 map 方法的作用 map 是 JavaScript 数组的一个高阶函数,用于对数组中的每个元素进行操作,并返回一个新的数组。新数组的每个元素是原数组中对应元…

代码随想录day15 二叉树(3)

文章目录 day11 栈与队列(2)栈与队列的总结 day13 二叉树(1)day14 二叉树(2)day15 二叉树(3) day11 栈与队列(2) 逆波兰表达式求值 https://leetcode.cn/problems/evaluate-reverse-polish-notation/ 逆…

计算机毕业设计Python+大模型股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! Python大模型股票预测系统 …

[山河CTF 2024] week3

一周不在家,这是补的最后一篇。后边的还有0xgame和shctf的末周。打不动了。 Crypto Approximate_n 题目分两部分,flag分两块两个RSA,第1个泄露了4个n_approxkpr的值,后边只泄露了1个。 第1部分利用以前的模板,造格…

基于SSM+VUE园艺生活植物网站JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档(1万字以上)开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统:Window操作系统 2、开发工具:IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

C++初阶(八)--内存管理

目录 引入: 一、C中的内存布局 1.内存区域 2.示例变量存储位置说明 二、C语言中动态内存管理 三、C内存管理方式 1.new/delete操作内置类型 2.new和delete操作自定义类型 四、operator new与operator delete函数(重要点进行讲解) …