91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

MyBatis Plus解決大數據量查詢慢問題

jf_ro2CN3Fa ? 來源:CSDN ? 2023-01-16 10:17 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

  • 常規查詢
  • 流式查詢
  • 游標查詢

大數據量操作的場景大致如下:

  • 數據遷移
  • 數據導出
  • 批量處理數據

在實際工作中當指定查詢數據過大時,我們一般使用分頁查詢的方式一頁一頁的將數據放到內存處理。但有些情況不需要分頁的方式查詢數據或分很大一頁查詢數據時,如果一下子將數據全部加載出來到內存中,很可能會發生OOM(內存溢出);而且查詢會很慢,因為框架耗費大量的時間和內存去把數據庫查詢的結果封裝成我們想要的對象(實體類)。

舉例:在業務系統需要從 MySQL 數據庫里讀取 100w 數據行進行處理,應該怎么做?

做法通常如下:

  • 常規查詢: 一次性讀取 100w 數據到 JVM 內存中,或者分頁讀取
  • 流式查詢: 建立長連接,利用服務端游標,每次讀取一條加載到 JVM 內存(多次獲取,一次一行)
  • 游標查詢: 和流式一樣,通過 fetchSize 參數,控制一次讀取多少條數據(多次獲取,一次多行)

常規查詢

默認情況下,完整的檢索結果集會將其存儲在內存中。在大多數情況下,這是最有效的操作方式,并且由于 MySQL 網絡協議的設計,因此更易于實現。

舉例:

假設單表 100w 數據量,一般會采用分頁的方式查詢:

@Mapper
publicinterfaceBigDataSearchMapperextendsBaseMapper<BigDataSearchEntity>{

@Select("SELECTbds.*FROMbig_data_searchbds${ew.customSqlSegment}")
PagepageList(@Param("page")Pagepage,@Param(Constants.WRAPPER)QueryWrapperqueryWrapper);

}

注:該示例使用的 MybatisPlus

該方式比較簡單,如果在不考慮 LIMIT 深分頁優化情況下,估計你的數據庫服務器就噶皮了,或者你能等上幾十分鐘或幾小時,甚至幾天時間檢索數據

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

流式查詢

流式查詢指的是查詢成功后不是返回一個集合而是返回一個迭代器,應用每次從迭代器取一條查詢結果。流式查詢的好處是能夠降低內存使用。

如果沒有流式查詢,我們想要從數據庫取 100w 條記錄而又沒有足夠的內存時,就不得不分頁查詢,而分頁查詢效率取決于表設計,如果設計的不好,就無法執行高效的分頁查詢。因此流式查詢是一個數據庫訪問框架必須具備的功能。

MyBatis 中使用流式查詢避免數據量過大導致 OOM ,但在流式查詢的過程當中,數據庫連接是保持打開狀態的,因此要注意的是:

  • 執行一個流式查詢后,數據庫訪問框架就不負責關閉數據庫連接了,需要應用在取完數據后自己關閉。
  • 必須先讀?。ɑ蜿P閉)結果集中的所有行,然后才能對連接發出任何其他查詢,否則將引發異常。
MyBatis 流式查詢接口

MyBatis 提供了一個叫 org.apache.ibatis.cursor.Cursor 的接口類用于流式查詢,這個接口繼承了 java.io.Closeablejava.lang.Iterable 接口,由此可知:

  • Cursor 是可關閉的;
  • Cursor 是可遍歷的。

除此之外,Cursor 還提供了三個方法:

  • isOpen(): 用于在取數據之前判斷 Cursor 對象是否是打開狀態。只有當打開時 Cursor 才能取數據;
  • isConsumed(): 用于判斷查詢結果是否全部取完。
  • getCurrentIndex(): 返回已經獲取了多少條數據

使用流式查詢,則要保持對產生結果集的語句所引用的表的并發訪問,因為其 查詢會獨占連接,所以必須盡快處理

為什么要用流式查詢?

如果有一個很大的查詢結果需要遍歷處理,又不想一次性將結果集裝入客戶端內存,就可以考慮使用流式查詢;

分庫分表場景下,單個表的查詢結果集雖然不大,但如果某個查詢跨了多個庫多個表,又要做結果集的合并、排序等動作,依然有可能撐爆內存;詳細研究了sharding-sphere的代碼不難發現,除了group byorder by字段不一樣之外,其他的場景都非常適合使用流式查詢,可以最大限度的降低對客戶端內存的消耗。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

游標查詢

對大量數據進行處理時,為防止內存泄漏情況發生,也可以采用游標方式進行數據查詢處理。這種處理方式比常規查詢要快很多。

當查詢百萬級的數據的時候,還可以使用游標方式進行數據查詢處理,不僅可以節省內存的消耗,而且還不需要一次性取出所有數據,可以進行逐條處理或逐條取出部分批量處理。一次查詢指定 fetchSize 的數據,直到把數據全部處理完。

Mybatis 的處理加了兩個注解:@Options@ResultType

@Mapper
publicinterfaceBigDataSearchMapperextendsBaseMapper<BigDataSearchEntity>{

//方式一多次獲取,一次多行
@Select("SELECTbds.*FROMbig_data_searchbds${ew.customSqlSegment}")
@Options(resultSetType=ResultSetType.FORWARD_ONLY,fetchSize=1000000)
PagepageList(@Param("page")Pagepage,@Param(Constants.WRAPPER)QueryWrapperqueryWrapper);

//方式二一次獲取,一次一行
@Select("SELECTbds.*FROMbig_data_searchbds${ew.customSqlSegment}")
@Options(resultSetType=ResultSetType.FORWARD_ONLY,fetchSize=100000)
@ResultType(BigDataSearchEntity.class)
voidlistData(@Param(Constants.WRAPPER)QueryWrapper<BigDataSearchEntity>queryWrapper,ResultHandler<BigDataSearchEntity>handler);

}

@Options

  • ResultSet.FORWORD_ONLY:結果集的游標只能向下滾動
  • ResultSet.SCROLL_INSENSITIVE:結果集的游標可以上下移動,當數據庫變化時,當前結果集不變
  • ResultSet.SCROLL_SENSITIVE:返回可滾動的結果集,當數據庫變化時,當前結果集同步改變
  • fetchSize:每次獲取量

@ResultType

  • @ResultType(BigDataSearchEntity.class):轉換成返回實體類型

注意:返回類型必須為 void ,因為查詢的結果在 ResultHandler 里處理數據,所以這個 hander 也是必須的,可以使用 lambda 實現一個依次處理邏輯。

注意:

雖然上面的代碼中都有 @Options 但實際操作卻有不同:

  • 方式一是多次查詢,一次返回多條;
  • 方式二是一次查詢,一次返回一條;

原因:

Oracle 是從服務器一次取出 fetch size 條記錄放在客戶端,客戶端處理完成一個批次后再向服務器取下一個批次,直到所有數據處理完成。

MySQL 是在執行 ResultSet.next() 方法時,會通過數據庫連接一條一條的返回。flush buffer 的過程是阻塞式的,如果網絡中發生了擁塞,send buffer 被填滿,會導致 buffer 一直 flush 不出去,那 MySQL 的處理線程會阻塞,從而避免數據把客戶端內存撐爆。

非流式查詢和流式查詢區別:

  • 非流式查詢:內存會隨著查詢記錄的增長而近乎直線增長。
  • 流式查詢:內存會保持穩定,不會隨著記錄的增長而增長。其內存大小取決于批處理大小BATCH_SIZE的設置,該尺寸越大,內存會越大。所以BATCH_SIZE應該根據業務情況設置合適的大小。

另外要切記每次處理完一批結果要記得釋放存儲每批數據的臨時容器,即上文中的gxids.clear();

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據庫
    +關注

    關注

    7

    文章

    3927

    瀏覽量

    66283
  • MySQL
    +關注

    關注

    1

    文章

    860

    瀏覽量

    27957
  • 數據遷移
    +關注

    關注

    0

    文章

    84

    瀏覽量

    7114

原文標題:MyBatis Plus 解決大數據量查詢慢問題

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    cypress3014怎么查看USB走線每幀傳輸的圖像數據量?

    你好,請問怎么查看USB 走線每幀傳輸的圖像數據量
    發表于 05-14 06:12

    ClickHouse 的“獨孤九劍”:極速查詢的終極秘籍

    引言 在大數據時代的江湖,數據量呈爆炸式增長,如何高效地處理和分析海量數據成為了一個關鍵問題。各路英雄豪杰紛紛亮出自己的絕技,爭奪數據處理的巔峰寶座。而在這場激烈的角逐中,ClickH
    的頭像 發表于 04-07 13:34 ?257次閱讀
    ClickHouse 的“獨孤九劍”:極速<b class='flag-5'>查詢</b>的終極秘籍

    STM32F429以太網外設數據處理上限是多少?

    無法通信-通信延時-通信恢復,wireshark數據暫未獲取到。 請幫忙分析以上現象是否為429的MAC核無法支持大數據量的沖刷,即使MAC過濾減輕了應用層的壓力,在MAC硬件層仍會造成擁塞或某種溢出。謝謝
    發表于 03-13 06:52

    RAM容量不足導致的數據溢出如何預防和處理?

    在 STM32F411 中,RAM 容量是有限的,特別是在進行復雜的數據處理和存儲時,可能會遇到數據溢出問題。數據溢出是指程序運行時,數據超出了 RAM 的分配區域,導致程序崩潰或
    發表于 03-07 16:09

    HAL庫SPI DMA批量傳輸數據量最大為2^16,有沒有辦法改成上限為2^32?

    HAL庫SPI DMA批量傳輸數據量最大為2^16,有沒有辦法改成上限為2^32
    發表于 03-07 13:02

    企業并購中SAP系統的三大數據轉型挑戰以及來如何應對?

    SNP探討并購中數據挑戰:系統不匹配、停機時間長、數據量大。提出解決方案:調整系統一致性、最小化停機時間、管理數據量。通過CrystalBridge?和OutboardERP實現成功案例。
    的頭像 發表于 02-27 17:02 ?324次閱讀

    調試16位adc芯片ads8328時轉換后的數據波動100個數據量轉換后的數據有波動,而且測量值比理論值小,為什么?

    調試16位adc芯片ads8328時轉換后的數據波動100個數據量轉換后的數據有波動,而且測量值比理論值小。輸入電壓使用安捷倫的數字電壓源給的,基準時REF3120,2.048V的,都是TI的產品,以下是我的硬件電路和測量的
    發表于 01-24 06:52

    一種輕分表方案-MyBatis攔截器分表實踐

    作者:京東零售 張均杰 背景 部門內有一些億級別核心業務表增速非???,增量日均100W,但線上業務只依賴近一周的數據。隨著數據量的迅速增長,SQL頻發,數據庫性能下降,系統穩定性受到
    的頭像 發表于 01-23 17:38 ?422次閱讀

    系統要求20微秒采集一次數據,每次數據量4.8Kb,總的速率為240Mbps,ADC0XD1520RB評估板能否滿足需求?

    有幾個問題請教各位專家: 1、我的系統要求20微秒采集一次數據(單通道模式下3Gsps),每次數據量4.8Kb,總的速率為240Mbps,ADC0XD1520RB這個評估板能否滿足需求。緩沖容量
    發表于 12-26 07:43

    緩存對大數據處理的影響分析

    緩存對大數據處理的影響顯著且重要,主要體現在以下幾個方面: 一、提高數據訪問速度 在大數據環境中,數據存儲通常采用分布式存儲系統,數據量龐大
    的頭像 發表于 12-18 09:45 ?779次閱讀

    Mybatis 攔截器實現單數據源內多數據庫切換

    作者:京東保險 王奕龍 物流的分揀業務在某些分揀場地只有一個數據源,因為數據量比較大,將所有數據存在一張表內查詢速度,也為了做不同設備
    的頭像 發表于 12-12 10:23 ?1338次閱讀

    emc技術在大數據分析中的角色

    在當今這個數據驅動的世界中,大數據分析已經成為企業獲取洞察力、優化業務流程和提高競爭力的關鍵工具。隨著數據量的爆炸性增長,企業面臨著如何有效存儲、處理和分析這些數據的挑戰。 1.
    的頭像 發表于 11-01 15:22 ?690次閱讀

    智慧城市與大數據的關系

    智慧城市與大數據之間存在著密切的關系,這種關系體現在大數據對智慧城市建設的支撐和推動作用,以及智慧城市產生的大量數據大數據技術的應用需求。 大數據
    的頭像 發表于 10-24 15:27 ?1336次閱讀

    大數據從業者必知必會的Hive SQL調優技巧

    大數據從業者必知必會的Hive SQL調優技巧 摘要 :在大數據領域中,Hive SQL被廣泛應用于數據倉庫的數據查詢和分析。然而,由于數據量
    的頭像 發表于 09-24 13:30 ?701次閱讀

    獨家探秘!Datasheet5背后的大數據機制

    現在市面上林林總總、各式各樣的數據手冊網站,國內的,國外的,并不少,也都號稱運用大數據智能匹配和運算,為工程師提供數據手冊查詢、器件參數,應用等等等等。
    的頭像 發表于 08-26 17:24 ?709次閱讀
    獨家探秘!Datasheet5背后的<b class='flag-5'>大數據</b>機制
    主站蜘蛛池模板: 欧美一区二区三区免费高 | 久久99精品一级毛片 | 在线观看黄色x视频 | 波多野结衣久久国产精品 | 三级理论在线播放大全 | 黑人又大又粗又长又深受不了 | 久久久久久久久久免观看 | 国产一区国产二区国产三区 | 日日爽天天干 | 在线小视频你懂的 | 狠狠色丁香婷婷综合小时婷婷 | 午夜黄 | 精品伊人久久大香线蕉网站 | 一区二区三区伦理 | 久久精品免费 | 天堂在线观看 | 亚洲播播播 | 免费又爽又黄禁片视频在线播放 | 男男污肉高h坐便器调教 | 色在线免费视频 | 在线a亚洲老鸭窝天堂新地址 | 高清激情小视频在线观看 | 亚洲成av人影片在线观看 | 你懂得国产 | 国内自拍 亚洲系列 欧美系列 | 亚洲乱亚洲乱妇41p国产成人 | 日本高清视频色wwwwww色 | 天天综合干| 老师你好大好白好紧好硬 | 在线种子搜索 | 淫五月| 日本免费一级 | а8天堂资源在线官网 | 甘婷婷一级毛片免费看 | 午夜神马福利 | 狠狠色丁香久久婷婷 | 操吧| 人人插人人爱 | 综合丁香| 免费精品99久久国产综合精品 | 久久精品94精品久久精品 |