大數據量條件SQL查詢內存處理方案以及數據過濾算法優化

MySQL是一個廣泛使用的關系型數據庫管理系統。通過SQL語言進行數據操作和查詢,還支持多用戶、多線程和分布式操作等功能。

在實際使用中,我們會遇到各種查詢條件,如字段名、表名、邏輯運算符、比較運算符、函數等。其中,有些查詢條件可能數據量比較大,導致查詢速度變慢。下面就來探討一下如果通過利用內存過濾方式來進行效率優化。

相信各位應用研發小伙伴在日常研發過程中,會經常遇到批量入參場景,需要根據入參信息從數據庫獲取相應資訊。

常規的做法,大家更多的會采用對入參數據拼接形成執行SQL方式,因為這種方式編寫簡單,邏輯清晰,但是面臨的可能是嚴重的效能問題。

【場景舉例】

接口API - data.get 入參集合ParamLists為1000筆數據,業務邏輯需要根據入參條件批量獲取業務數據,并進行業務后續業務處理:

目前應用研發常用方式【SQL拼接】:

當前方式是否存在效能風險?

  • 因為每個條件都需要進行判斷,并且需要根據條件進行索引以查找匹配值。如果條件過多,則檢索的數據量就會變得非常大,因此查詢效率會降低。
  • 查詢條件也會影響索引的使用。如果一個查詢條件沒有索引,那么MySQL就需要掃描整個表來找到匹配值,這也是很耗時,根據以往慢SQL表現,一般耗時會在5s以上。

先可以通過執行計劃,判斷當前SQL是否有效或者正確的使用到索引。在索引分析時,需要注意的是,并不是SQL有使用到索引就排除索引問題,執行計劃索引分析時,需要關注type欄位,判斷出當前是否使用到索引,以及索引使用類型,range、index、all都是需要被重點關注的。同時結合ref,key_len欄位判斷索引使用是否合理 ,以及extra判斷是否有額外操作消耗,比如排序、臨時表等。

下面主要說明下,對于這種大量入參拼接查詢場景,怎么可以通過內存過濾方式處理。思想是,在一定數據量前提下,利用索引快速查詢冗余數據,同?時結合內存快速過濾需要的數據。

(1)數據量評估

評估使用索引欄位查詢后的數據量,比如以上案例tenatsid為wo_detail索引欄位,則查看該租戶下數據量,如果數據量為2w以內(這里為初略標準,具體可以根據需要輸出的欄位以及數據量做內存評估),

則可以考慮使用內存方式解決,如果數據量過大,可能會帶來額外的內存或者效能問題。

(2)SQL調整

此時SQL可以調整為:

因為整體數據量少,且能有效使用到索引查詢,因此SQL查詢效率快,一般在毫秒級,如果索引條件更加精確可以減少更多數據量。但需要注意的是,當前獲取到數據集是冗余的,它包含了我們需要的數據集以及其它數據集。接下來就是期望在內存中過濾出我們需要的數據

(3)內存數據過濾優化

到此我們期望從2w筆數據在內存中快速找到1000筆數據信息:

驗證數據準備:

1、datas 為數據庫讀取數據約2w筆

2、param 為入參數據量約1000筆

數據對應關系:1v1,即1個入參條件對應1條數據庫數據

(為了測試內存數據過濾優化帶來的效能提升,我這里提前將入參和數據庫數據按統一條件排序

【常規循環讀取】

結果:

過濾耗時約2秒,相對于直接從數據庫讀取數據,在一定數據量下前提下,內存過濾時間相對更快。

是否有更快的過濾優化方式呢?

當然有

  • 確保入參數據和查找數據的保持相同的欄位順序,減少無效查找次數。
  • 內循環查找中記錄index,減少時間復雜度。

思路如下:

因為ParmList與查詢數據保持相同欄位順序,再過濾過程中,每處理掃描一條數據數組則index++

當進行F10-230807002數據查找時,此時index=2,這時直接從數據庫集合中index為2位置開始讀取數據。

如此,在1v1數據查詢中,可以將時間復雜度從O(N*M)將到O(N),在1vN中數據庫集合越大,則提效越明顯。

結果:

可以看到耗時時間從2s - >6ms

如果:入參和數據庫場景為1vn場景下,這個時候就不能使用break,可以定義一個標識來記錄當前入參數據的讀取是否結束

結論

? ? ? 在大數據量拼接SQL查詢業務中,根據場景數據量、復雜程度等條件綜合判斷優化方案,一般場景中數據量不是很大時可以考慮使用【冗余讀取+內存過濾優化方案】來處理。如果數據集合過大,可能帶來內存和更多的效能問題時,可以考慮采用其他方案,比如分批處理、臨時表關聯處理等

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164021.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164021.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164021.shtml

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

相關文章

淺析智慧社區建設趨勢及AI大數據監管平臺方案設計

一、背景與需求 伴隨著社會與經濟的發展,人們對生活質量的要求越來越高,與此同時,新興技術的進步也促進了智慧社區市場的逐步成熟。智慧社區是社區管理的一種新理念,是新形勢下城市與社會管理的一種創新模式。 在上海、杭州、深…

在.bashrc文件修改環境變量的做法

作者:朱金燦 來源:clever101的專欄 為什么大多數人學不會人工智能編程?>>> ~/.bashrc文件是linux下保存環境變量的系統文件。原以為使用sed命令修改.bashrc文件,實際上不行,需要使用echo命令。具體示例如下…

02-詳細介紹Java8新特性方法引用,構造引用,數組引用

方法/構造/數組引用 方法引用 當要傳遞給Lambda體的操作已經有實現的方法時就可以使用方法引用,方法引用和構造器引用就是為了簡化Lambda表達式 方法引用可以看做是Lambda表達式深層次的表達,方法引用本質還是Lambda表達式所以也是函數式接口的一個實例通過方法的名字來指向…

小紅書關鍵詞搜索商品列表API接口(分類ID搜索商品數據接口,商品詳情接口)演示案例

通過關鍵詞搜索商品API接口,電商平臺可以為消費者提供一個簡單、快捷的商品搜索功能。用戶只需輸入關鍵詞,就可以得到與該關鍵詞相關的商品列表。關鍵詞搜索商品API接口還可以提供給第三方開發者一個便捷的商品搜索服務。開發者可以利用該接口&#xff0…

Mac安裝配置typescript及在VSCode上運行ts

一、Mac上安裝typescript sudo npm install -g typescript 測試一下:出現Version則證明安裝成功 tsc -v 二、在VSCode上運行 新建一個xxx.ts文件,測試能否運行 console.log("helloworld") 運行報錯:ts-node: command not…

后滲透持久性-– 服務控制管理器

執行以下命令將快速檢索服務控制管理器實用程序的 SDDL 權限。 sc sdshow scmanager服務控制管理器 – 安全描述符 PowerShell 還可用于枚舉所有用戶組的 SDDL 權限并將其轉換為可讀格式。 $SD Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\Schedule\S…

shell 條件語句 if case

目錄 測試 test測試文件的表達式 是否成立 格式 選項 比較整數數值 格式 選項 字符串比較 常用的測試操作符 格式 邏輯測試 格式 且 (全真才為真) 或 (一真即為真) 常見條件 雙中括號 [[ expression ]] 用法 &…

美國服務器在大陸連不上怎么回事?

?  在租用任何美國服務器之前,都需要先搞清楚一些使用問題,畢竟服務器能夠不間斷地訪問也是站在們所期望的。但有時,美國服務器網站或許也會突然出現在大陸打不開的情況,在面臨這種情況時,我們應該怎么做? 查看連不…

【史上最細教程】服務器MySQL數據庫完成主從復制

文章目錄 MySQL完成主從復制教程準備:原理:步驟: 推薦文章 MySQL完成主從復制教程 主從復制(也稱 AB 復制)就是將一個服務器(主服務器)的數據復制到一個或多個MySQL數據庫服務器(從…

Java飛翔的鳥

創建三個包,存放代碼。把圖片放進文件中 APP包(運行) GameApp類 package APP; import mian.GameFrame;public class GameApp {public static void main(String[] args) {new GameFrame();} } mian包(主內容) Barri…

python獲取json所有節點和子節點

使用python獲取json的所有父結點和子節點 并使用父節點加下劃線命名子節點 先展示一段json代碼 {"level1": {"level2": {"level3": [{"level4": "4value"},{"level4_2": "4_2value"}]},"level2_…

電力行業的智能調度:數字孿生技術

隨著科技的發展,數字孿生技術正逐漸滲透到各個行業領域,其中包括電力行業。數字孿生技術為電力行業帶來了前所未有的機遇,使得電力系統的運行更加高效、安全和可持續。本文借用山海鯨可視化軟件幾個電力行業數字孿生案例探討數字孿生技術在電…

介紹幾種Go語言開發的IDE

文章目錄 1.前言2.幾種ide2.1 Goland2.2 VsCode示例 2.3 LiteIDE2.4 Eclipse插件GoClipse2.5 Atom2.6 Vim2.7 Sublime Text 3.總結寫在最后 1.前言 Go語言作為一種新興的編程語言,近年來受到了越來越多的關注。 它以其簡潔、高效和并發性能而聞名,被廣…

Jmeter 壓測保姆級入門教程

1、Jmeter本地安裝 1.1、下載安裝 軟件下載地址: https://mirrors.tuna.tsinghua.edu.cn/apache/jmeter/binaries/ 選擇一個壓縮包下載即可 然后解壓縮后進入bin目錄直接執行命令jmeter即可啟動 1.2 修改語言 默認是英文的,修改中文,點擊…

關于解決C# WinForm中Chart控件增刪數據時報錯的解決方法

1.報錯代碼 System.InvalidOperationExceptionHResult=0x80131509Message=集合已修改;可能無法執行枚舉操作。具體報錯表現為,在Application.Run(Form1())中斷。 2.解決方法 這個錯誤通常是由于在枚舉集合時對集合進行了修改而引起的。在修改完chart控件中的內容后,可能會…

Linux---常用命令匯總

文章目錄 關于目錄操作的命令ls/llcdpwdmkdir 關于文件操作的命令touchechocatrmmvcpvim 關于查詢操作的命令greppsnetstat 關于目錄操作的命令 ls/ll ls : 列出當前目錄下的目錄和文件(以行的展示形式) ll : 列出當前目錄下的目錄和文件&…

Django之Cookie與Session,CBV加裝飾器

前言 會話跟蹤技術 在一個會話的多個請求中共享數據,這就是會話跟蹤技術。例如在一個會話中的請求如下: ? 請求銀行主頁; 請求登錄(請求參數是用戶名和密碼);請求轉賬(請求參數與轉賬相關的數…

Thread類常用成員方法

點擊鏈接返回標題-> Java線程的學習-CSDN博客 目錄 前言 有關線程名字的成員方法: String getName() void setName(String name) Thread(String name) 獲取線程對象的成員方法: static Thread currentThread() 讓線程睡眠的成員方法&#xff1…

時間序列分析算法的概念、模型檢驗及應用

時間序列分析是一種用于研究隨時間變化的數據模式和趨勢的統計方法。這類數據通常按照時間順序排列,例如股票價格、氣溫、銷售額等。時間序列分析的目標是從過去的觀測中提取信息,以便預測未來的趨勢。 以下是關于時間序列分析的一些重要概念、模型檢驗…

python 數據類型之集合

常見的數據類型: int,整數類型(整形)bool,布爾類型str,字符串類型list,列表類型tuple,元組類型dict,字典類型,一個容器且元素必須是鍵值對。set,…