記一次復雜分頁查詢的優化歷程:從臨時表到普通表的架構演進

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.pswp.cn/bicheng/71752.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71752.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71752.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++關鍵字之mutable

1.介紹 在C中,mutable是一個關鍵字,用于修飾類的成員變量。它的主要作用是允許在常量成員函數或常量對象中修改被標記為mutable的成員變量。通常情況下,常量成員函數不能修改類的成員變量,但有些情況下,某些成員變量的…

云計算中的API網關是什么?為什么它很重要?

在云計算架構中,API網關(API Gateway)是一個重要的組件,主要用于管理、保護和優化不同服務之間的接口(API)通信。簡單來說,API網關就像是一個中介,它充當客戶端和后端服務之間的“橋…

深搜專題2:組合問題

描述 組合問題就是從n個元素中抽出r個元素(不分順序且r < &#xff1d; n)&#xff0c; 我們可以簡單地將n個元素理解為自然數1&#xff0c;2&#xff0c;…&#xff0c;n&#xff0c;從中任取r個數。 例如n &#xff1d; 5 &#xff0c;r &#xff1d; 3 &#xff0c;所…

uniapp多端適配

UniApp是一個基于Vue.js開發多端應用的框架&#xff0c;它可以讓開發者編寫一次代碼&#xff0c;同時適配iOS、Android、Web等多個平臺。 環境搭建&#xff1a; UniApp基于Vue.js開發&#xff0c;所以需要先安裝Vue CLI npm install -g vue/cli 創建一個新的UniApp項目&…

Error [ERR_REQUIRE_ESM]: require() of ES Module

報錯信息&#xff1a; 【報錯】Message.js 導入方式不對&#xff0c;用的是 ES Moudle 的語法&#xff0c;提示使用 import 引入文件 項目開發沒有用到 js-message 依賴&#xff0c;是 node-ipc 依賴中用到的 js-message 依賴&#xff0c; node-ipc 中限制 js-message 版本&a…

給小米/紅米手機root(工具基本為官方工具)——KernelSU篇

目錄 前言準備工作下載刷機包xiaomirom下載刷機包【適用于MIUI和hyperOS】“hyper更新”微信小程序【只適用于hyperOS】 下載KernelSU刷機所需程序和驅動文件 開始刷機設置手機第一種刷機方式【KMI】推薦提取boot或init_boot分區 第二種刷機方式【GKI】不推薦 結語 前言 刷機需…

CSS通過webkit-scrollbar設置滾動條樣式

查看::-webkit-scrollbar-*各項關系 以下圖為例&#xff0c;可以分別定義滾動條背景、滾動軌道、滾動滑塊的樣式。 需要先給外部容器設置高度&#xff0c;再設置overflow: auto&#xff0c;最后設置三個webkit屬性。 <!DOCTYPE html> <html lang"en">…

自制操作系統前置知識匯編學習

今天要做什么&#xff1f; 為了更好的理解書中內容&#xff0c;需要學習下進制分析和匯編。 匯編語言其實應該叫叫機器指令符號化語言&#xff0c;目前的匯編語言是學習操作系統的基礎。 一&#xff1a;觸發器 電路觸發器的鎖存命令默認是斷開的&#xff0c;是控制電路觸發器…

uCOSIII-移植

一、uCOS移植 1.移植 C/OS-III前&#xff0c;需要獲取C/OS-III 的源代碼&#xff0c;C/CPU 和 C/LIB 這兩個組件的源代碼。 2.將獲取的uCOSIII源代碼添加到工程文件中&#xff1a; ①.uC-CPU/ARM-Cortex-M/ARMv7-M/ARM/cpu_a.asm、uC-CPU\ARM-Cortex-M\ARMv7-M\cpu_c.c 和 uC-…

Windows使用docker部署fastgpt出現的一些問題

文章目錄 Windows使用docker部署FastGPT出現的一些問題1.docker部署pg一直重啟的問題2.重啟MongoDB之后一直出現“Waiting for MongoDB to start...”3.oneapi啟動不了failed to get gpt-3.5-turbo token encoder Windows使用docker部署FastGPT出現的一些問題 1.docker部署pg一…

【Python爬蟲(52)】探秘Scrapy:項目結構與配置全解析

【Python爬蟲】專欄簡介&#xff1a;本專欄是 Python 爬蟲領域的集大成之作&#xff0c;共 100 章節。從 Python 基礎語法、爬蟲入門知識講起&#xff0c;深入探討反爬蟲、多線程、分布式等進階技術。以大量實例為支撐&#xff0c;覆蓋網頁、圖片、音頻等各類數據爬取&#xff…

【Android】ViewPager的使用

AndroidManifest.xml <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"><applicationandroid:allowBac…

京東廣告基于 Apache Doris 的冷熱數據分層實踐

一、背景介紹 京東廣告圍繞Apache Doris建設廣告數據存儲服務&#xff0c;為廣告主提供實時廣告效果報表和多維數據分析服務。歷經多年發展&#xff0c;積累了海量的廣告數據&#xff0c;目前系統總數據容量接近1PB&#xff0c;數據行數達到18萬億行&#xff0c;日查詢請求量8…

Windows PyCharm的python項目移動存儲位置后需要做的變更

項目使用的venv虛擬環境&#xff0c;因此項目移動存儲位置后需要重新配置python解釋器的位置&#xff0c;否則無法識別&#xff0c;若非虛擬環境中運行&#xff0c;則直接移動后打開即可&#xff0c;無需任何配置。 PyCharm版本為2021.3.3 (Professional Edition)&#xff0c;其…

前后端對接

前端與后端的對接主要通過 接口 進行數據交互&#xff0c;具體流程和方式如下&#xff1a; 1. 明確需求與接口定義 前后端協商&#xff1a;確定需要哪些接口、接口的功能、請求參數和返回格式。接口文檔&#xff1a;使用工具&#xff08;如 Swagger、Postman、Apifox&#xff…

簡識MQ之Kafka、ActiveMQ、RabbitMQ、RocketMQ傳遞機制

四種主流消息隊列&#xff08;Kafka、ActiveMQ、RabbitMQ、RocketMQ&#xff09;的生產者與消費者傳遞信息的機制說明&#xff0c;以及實際使用中的注意事項和示例&#xff1a; 1. Apache Kafka 傳遞機制 模型&#xff1a;基于 發布-訂閱模型&#xff0c;生產者向 主題&#…

Websocket——心跳檢測

1. 前言&#xff1a;為什么需要心跳機制&#xff1f; 在現代的實時網絡應用中&#xff0c;保持客戶端和服務端的連接穩定性是非常重要的。尤其是在長時間的網絡連接中&#xff0c;存在一些異常情況&#xff0c;導致服務端無法及時感知到客戶端的斷開&#xff0c;可能造成不必要…

tailwindcss 前端 css 框架 無需寫css 快速構建頁面

版本&#xff1a;VUE3 TS 框架 vite 文章中使用tailwindcss 版本&#xff1a; ^3.4.17 簡介&#xff1a; Tailwind CSS 一個CSS 框架&#xff0c;提供組件化的樣式&#xff0c;直接在HTML 中編寫樣式&#xff0c;無需額外自定義CSS &#xff0c;快速&#xff01; 簡潔&#…

MFC開發:如何創建第一個MFC應用程序

文章目錄 一、概述二、MFC 的主要組件三、創建一個MFC窗口四、控件綁定消息函數 一、概述 MFC 是微軟提供的一個 C 類庫&#xff0c;用于簡化 Windows 應用程序的開發。它封裝了 Windows API&#xff0c;提供面向對象的接口&#xff0c;幫助開發者更高效地創建圖形用戶界面&am…

【Git版本控制器】第四彈——分支管理,合并沖突,--no-ff,git stash

&#x1f381;個人主頁&#xff1a;我們的五年 &#x1f50d;系列專欄&#xff1a;Linux網絡編程 &#x1f337;追光的人&#xff0c;終會萬丈光芒 &#x1f389;歡迎大家點贊&#x1f44d;評論&#x1f4dd;收藏?文章 ? 相關筆記&#xff1a; https://blog.csdn.net/djd…