记一次复杂分页查询的优化历程:从临时表到普通表的架构演进

news2025/2/24 15:19:23

1. 问题背景

在项目开发中,我们需要实现一个复杂的分页查询功能,涉及大量 IP 地址数据的处理和多表关联。在我接手这个项目的时候,代码是这样的

要知道代码里面的 ipsList 数据可能几万条甚至更多,这样拼接的sql,必然是要内存溢出的,一味地扩大jvm参数不是解决问题的根本

2.优化历程

2.1.临时表处理

为了解决内存溢出的问题,我尝试使用临时表,分批次处理ipsList数据

虽然解决了栈溢出的问题,但是数据量太大,频繁的io,单次查询的时间也大概在9秒左右,batchSize的值也不是越大越好,但是不管尝试多少,单次查询的时间最快也需要八秒多,如果我是用户,我觉得这是不能忍受的,但是对于程序员来说,能跑就行,想要快,那是另外的价钱,不过谁让我善良体贴又温柔呢,于是分析了一下,耗费时间的这一步无非是overhauledPlanMapper.insertBatchWithParams(params);

这个io操作,如果能异步并发处理的话,是不是就能解决查询慢的问题了,毕竟这也不涉及到共享变量的修改

(写到这里,手有些凉,于是插进了口袋,糟糕,早上买的两个鸡蛋忘记吃了,这一天天的上班把我脑子都上坏了)

2.2异步并发编程

到这里我觉得已经很完美的解决了这个问题了,等我部署上去运行的时候

我很无解,仔细研究了代码,我不明白为什么会出现临时表不存在的问题,看了日志我发现在insert语句还没有完成之前表就已经被drop了,一开始我以为是线程安全问题,于是我开始尝试加锁,使用synchronized(TEMP_TABLE_LOCK)全局锁,使用事务,确保所有操作在同一个事务中进行,但是不管我使用哪种方法,依然会存在临时表不存在的问题,这让我很百思不得其解.

在翻阅了很多资料之后我终于发现了问题所在,问题就出在临时表上,让我们看看临时表的特点

生命周期:

  • 临时表(TEMPORARY TABLE):

  • 仅在当前会话(Session)可见

  • 会话结束时自动删除

  • 不同会话间互不可见

可见性:

  • 临时表: 只对创建它的会话可见

看到这我终于明白了为什么会出现这个问题了,我得表是在主线程创建的,由于 临时表仅在当前会话可见,不同会话间不能共享,所以子线程在并发插入的时候无法访问主线程创建的表,我悟了,但是我又触底反弹了,舔狗的剧本里舔狗才是主角,额…不好意思,走错片场了.

到这问题就简单了,我只需要把临时表修改成普通表就行了,只需要删除TEMPORARY关键字就行

到这里大功告成,已经完美解决了临时表不存在的问题,部署运行,尝试了多个batchSize的值,最终发现当batchSize=1000左右的时候,查询效率最高,单次查询时间在1.8秒左右

但是如果batchSize设置成固定的值的话,我觉得可能会出现个问题,如果ipsList的数量太大,就是批次太多,可能会有上百个批次,也就意味着可能会出现同时并发上百个线程,而你的cpu又不能同时负担这么多线程的话,就会出现线程阻塞,服务就会卡死,于是再优化一波

这是最终的版本,写注释呢并不是给我看,我是怕后面接手的人看不懂,毕竟每次改别人的代码我都是边骂边改的,口吐芬芳,鸟语花香,如芒刺背,如坐针毡,如鲠在喉…

虽然说这只是一个简单的查询,但是这中间优化的过程还是挺有意思的,思想和逻辑可以运用到其他项目中的各个业务中,对我的启发还是挺大的,所以记录一下,此篇文章为中午休息时间所写,以此共勉…

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

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

相关文章

架构师面试(六):熔断和降级

问题 在千万日活的电商系统中,商品列表页服务通过 RPC 调用广告服务;经过统计发现,在最近10秒的时间里,商品列表页服务在对广告服务的调用中有 98% 的调用是超时的; 针对这个场景,下面哪几项的说法是正确的…

细说 Java 引用(强、软、弱、虚)和 GC 流程(二)

一、前文回顾 在 细说Java 引用(强、软、弱、虚)和 GC 流程(一) 我们对Java 引用有了总体的认识,本文将继续深入分析 Java 引用在 GC 时的一些细节。 还是从我们在前文中提到的引用流程图里说起,这里不清…

【深度学习】Unet的基础介绍

U-Net是一种用于图像分割的深度学习模型,特别适合医学影像和其他需要分割细节的任务。如图: Unet论文原文 为什么叫U-Net? U-Net的结构像字母“U”,所以得名。它的结构由两个主要部分组成: 下采样(编码…

ROS2机器人开发--服务通信与参数通信

服务通信与参数通信 在 ROS 2 中,服务(Services)通信和参数(Parameters)通信是两种重要的通信机制。服务是基于请求和响应的双向通信机制。参数用于管理节点的设置,并且参数通信是基于服务通信实现的。 1 …

DeepSeek写贪吃蛇手机小游戏

DeepSeek写贪吃蛇手机小游戏 提问 根据提的要求,让DeepSeek整理的需求,进行提问,内容如下: 请生成一个包含以下功能的可运行移动端贪吃蛇H5文件: 要求 蛇和食物红点要清晰,不超过屏幕外 下方有暂停和重新…

Python安全之反序列化——pickle/cPickle

一. 概述 Python中有两个模块可以实现对象的序列化,pickle和cPickle,区别在于cPickle是用C语言实现的,pickle是用纯python语言实现的,用法类似,cPickle的读写效率高一些。使用时一般先尝试导入cPickle&…

Deepin(Linux)安装MySQL指南

1.下载 地址:https://downloads.mysql.com/archives/community/ 2.将文件解压到 /usr/local 目录下 先cd到安装文件所在目录再解压,本机是cd /home/lu01/Downloads sudo tar -xvJf mysql-9.2.0-linux-glibc2.28-x86_64.tar.xz -C /usr/local3.创建软链…

vue-fastapi-admin 部署心得

vue-fastapi-admin 部署心得 这两天需要搭建一个后台管理系统,找来找去 vue-fastapi-admin 这个开源后台管理框架刚好和我的技术栈所契合。于是就浅浅的研究了一下。 主要是记录如何基于原项目提供的Dockerfile进行调整,那项目文件放在容器外部&#xf…

计算机视觉算法实战——三维重建(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ 1. 三维重建领域简介 三维重建(3D Reconstruction)是计算机视觉的核心任务之一,旨在通过多视角图像、视频…

迎接DeepSeek开源周[Kimi先开为敬]发布开源最新Muon优化器可替代 AdamW计算效率直接翻倍

Muon优化器在小规模语言模型训练中表现出色,但在大规模模型训练中的可扩展性尚未得到证实。月之暗面通过系统分析和改进,成功将 Muon 应用于 3B/16B 参数的 MoE 模型训练,累计训练 5.7 万亿 token。结果表明,Muon 可以替代 AdamW …

【工作流】Spring Boot 项目与 Camunda 的整合

【工作流】Spring Boot 项目与 Camunda 的整合 【一】Camunda 和主流流程引擎的对比【二】概念介绍【1】Camunda 概念:【2】BPMN 概念 【三】环境准备【1】安装流程设计器CamundaModeler【画图工具】(1)下载安装 【2】CamundaModeler如何设计…

Grouped-Query Attention(GQA)详解: Pytorch实现

Grouped-Query Attention(GQA)详解 Grouped-Query Attention(GQA) 是 Multi-Query Attention(MQA) 的改进版,它通过在 多个查询头(Query Heads)之间共享 Key 和 Value&am…

docker基操

docker基操 首先就是安装docker使用docker:创建容器-制作一个镜像-加载镜像首先就是安装docker 随便找一个教程安装就可以,安装过程中主要是不能访问谷歌,下面这篇文章写了镜像的一些问题: 安装docker的网络问题 使用docker:创建容器-制作一个镜像-加载镜像 主要是参考:这篇…

SF-HCI-SAP问题收集1

最近在做HCI的集成,是S4的环境,发现很多东西都跑不通,今天开始收集一下错误点 如果下图冲从0001变成0010,sfiom_rprq_osi表就会存数据,系统检查到此表就会报错,这个选项的作用就是自定义信息类型也能更新&a…

当 OpenAI 不再 open,DeepSeek 如何掀起 AI 开源革命?

开源与闭源的路线之争成为了行业瞩目的焦点,DeepSeek掀起的 AI 开源风暴! 一、硅谷“斯普特尼克时刻” 1957年,苏联将人类首颗人造卫星“斯普特尼克”送上太空,美国举国震动。 这颗“篮球”般的卫星,刺痛了自诩科技霸…

论文笔记-WSDM2025-ColdLLM

论文笔记-WSDM2025-Large Language Model Simulator for Cold-Start Recommendation ColdLLM:用于冷启动推荐的大语言模型模拟器摘要1.引言2.前言3.方法3.1整体框架3.1.1行为模拟3.1.2嵌入优化 3.2耦合漏斗ColdLLM3.2.1过滤模拟3.2.2精炼模拟 3.3模拟器训练3.3.1LLM…

基于 Python Django 的校园互助平台(附源码,文档)

博主介绍:✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不…

智慧废品回收小程序php+uniapp

废品回收小程序:数字化赋能环保,开启资源循环新时代 城市垃圾治理难题,废品回收小程序成破局关键 随着城市化进程加速与消费水平提升,我国生活垃圾总量逐年攀升,年均增速达5%-8%,其中超30%为可回收物。然…

网页版的俄罗斯方块

1、新建一个txt文件 2、打开后将代码复制进去保存 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>俄…

创建虚拟环境以及配置对应的项目依赖

文章目录 首先创建一个虚拟环境&#xff0c;创建一个名字为myenv,并且版本为xxx的虚拟环境 conda create --name myenv pythonxxx激活虚拟环境 conda activate myenv下载所需的依赖&#xff0c;如果有requirements.txt文件 pip install -r requirements.txt容易出现的错误&a…