哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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

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

3天內(nèi)不再提示

MyBatis Plus解決大數(shù)據(jù)量查詢慢問題

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

掃碼添加小助手

加入工程師交流群

  • 常規(guī)查詢
  • 流式查詢
  • 游標查詢

大數(shù)據(jù)量操作的場景大致如下:

  • 數(shù)據(jù)遷移
  • 數(shù)據(jù)導出
  • 批量處理數(shù)據(jù)

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

舉例:在業(yè)務系統(tǒng)需要從 MySQL 數(shù)據(jù)庫里讀取 100w 數(shù)據(jù)行進行處理,應該怎么做?

做法通常如下:

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

常規(guī)查詢

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

舉例:

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

@Mapper
publicinterfaceBigDataSearchMapperextendsBaseMapper<BigDataSearchEntity>{

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

}

注:該示例使用的 MybatisPlus

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

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

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

流式查詢

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

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

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

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

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

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

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

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

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

為什么要用流式查詢?

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

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

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

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

游標查詢

對大量數(shù)據(jù)進行處理時,為防止內(nèi)存泄漏情況發(fā)生,也可以采用游標方式進行數(shù)據(jù)查詢處理。這種處理方式比常規(guī)查詢要快很多。

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

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:結果集的游標可以上下移動,當數(shù)據(jù)庫變化時,當前結果集不變
  • ResultSet.SCROLL_SENSITIVE:返回可滾動的結果集,當數(shù)據(jù)庫變化時,當前結果集同步改變
  • fetchSize:每次獲取量

@ResultType

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

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

注意:

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

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

原因:

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

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

非流式查詢和流式查詢區(qū)別:

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

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

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴

原文標題:MyBatis Plus 解決大數(shù)據(jù)量查詢慢問題

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    NineData 2026年3月功能上新:支持飛書外部審批,增強查詢分析與數(shù)據(jù)復制能力

    NineData智能數(shù)據(jù)管理平臺2026年3月新功能發(fā)布,圍繞數(shù)據(jù)庫 DevOps、查詢分析、數(shù)據(jù)歸檔清理與
    的頭像 發(fā)表于 04-10 11:40 ?278次閱讀
    NineData 2026年3月功能上新:支持飛書外部審批,增強<b class='flag-5'>慢</b><b class='flag-5'>查詢</b>分析與<b class='flag-5'>數(shù)據(jù)</b>復制能力

    MySQL查詢調(diào)優(yōu)指南

    MySQL查詢數(shù)據(jù)庫性能問題的最常見原因。當一條SQL語句執(zhí)行超過1秒時,就可能影響用戶體驗;超過10秒時,通常會收到用戶投訴;而超過30秒的查詢,往往意味著系統(tǒng)存在嚴重的性能問題
    的頭像 發(fā)表于 04-09 10:01 ?152次閱讀

    MySQL數(shù)據(jù)查詢分析與優(yōu)化實戰(zhàn)

    在討論MySQL查詢之前,需要先明確一個關鍵前提:什么是查詢? 不同業(yè)務場景下,查詢的定義
    的頭像 發(fā)表于 04-02 09:38 ?144次閱讀

    SQL分析選型:DMS/DAS與NineData該如何選擇

    阿里云 DMS 的SQL 趨勢、DAS 的 SQL 審計能力成熟,可滿足阿里云用戶基礎需求。NineData 側重跨云統(tǒng)一工作臺、研發(fā)與 DBA 協(xié)同,打通日志分析、性能診斷、規(guī)范審核、索引建議全鏈路,更適配企業(yè)級
    的頭像 發(fā)表于 03-25 17:20 ?1518次閱讀
    <b class='flag-5'>慢</b>SQL分析選型:DMS/DAS與NineData該如何選擇

    輕松入門大數(shù)據(jù) 一站式完成核心能力構建 | 更新完結

    一站式掌握:大數(shù)據(jù)查詢優(yōu)化實戰(zhàn)技巧 在大數(shù)據(jù)時代,數(shù)據(jù)量從GB級躍升至TB級甚至PB級,查詢性能成為數(shù)據(jù)平臺的核心競爭力。一個原本秒級響應的
    的頭像 發(fā)表于 03-23 14:05 ?332次閱讀

    MySQL SQL 排查這件事,NineData 社區(qū)VS DBeaver/ Navicat 技術分析

    社區(qū)版的定位不同,它是免費、本地化部署的數(shù)據(jù)管理平臺,將數(shù)據(jù)庫 DevOps、數(shù)據(jù)復制、數(shù)據(jù)庫對比三大能力整合于一體。 在 MySQL
    的頭像 發(fā)表于 03-17 11:53 ?112次閱讀
    MySQL <b class='flag-5'>慢</b> SQL 排查這件事,NineData 社區(qū)VS DBeaver/ Navicat 技術分析

    MySQL查詢分析與索引調(diào)優(yōu)全流程

    MySQL 性能問題在生產(chǎn)環(huán)境中的表現(xiàn)通常是漸進式的:業(yè)務增長、數(shù)據(jù)量膨脹,某天突然發(fā)現(xiàn) P99 響應時間從 50ms 漲到 2s。查詢是最常見的根因,而索引設計不合理又是
    的頭像 發(fā)表于 03-06 15:56 ?228次閱讀

    Redis內(nèi)存管理、持久化策略與查詢排查分析

    Redis 在生產(chǎn)環(huán)境中承擔著緩存、會話存儲、消息隊列、分布式鎖等多種角色。隨著數(shù)據(jù)量增長和并發(fā)壓力上升,內(nèi)存碎片、持久化 I/O 抖動、查詢堆積這三類問題會逐漸顯現(xiàn),直接影響服務延遲和穩(wěn)定性。Redis 8.x 在內(nèi)存管理和
    的頭像 發(fā)表于 02-27 11:00 ?271次閱讀

    電能質(zhì)量在線監(jiān)測裝置的采集頻率調(diào)整對數(shù)據(jù)存儲有什么影響?

    電能質(zhì)量在線監(jiān)測裝置的采集頻率調(diào)整,核心影響是 “數(shù)據(jù)量與存儲資源的動態(tài)平衡” :采集頻率越高,單位時間產(chǎn)生的數(shù)據(jù)量越大,對存儲容量、存儲周期、硬件損耗的壓力越顯著;反之則數(shù)據(jù)量減少,存儲壓力降
    的頭像 發(fā)表于 12-11 10:41 ?894次閱讀
    電能質(zhì)量在線監(jiān)測裝置的采集頻率調(diào)整對<b class='flag-5'>數(shù)據(jù)</b>存儲有什么影響?

    rt_sem_take卡住導致線程無法正常運行怎么解決?

    串口接收數(shù)據(jù)后release信號,接收線程take sem,高頻大數(shù)據(jù)量接受數(shù)據(jù),運行一段時間后接受線程suspend,但是release正常釋放 出現(xiàn)問題問題后查看信息如下:
    發(fā)表于 09-23 08:17

    淘寶/天貓:使用物流查詢API實時顯示包裹位置,減少客服咨詢

    ? ?引言 在電商平臺的日常運營中,物流咨詢往往占據(jù)客服工作的40%以上。買家頻繁詢問"我的包裹到哪里了?"不僅增加客服壓力,還影響用戶體驗。本文將介紹如何通過 物流查詢API 實時顯示包裹位置
    的頭像 發(fā)表于 09-22 14:34 ?637次閱讀
    淘寶/天貓:使用物流<b class='flag-5'>查詢</b>API實時顯示包裹位置,減少客服咨詢<b class='flag-5'>量</b>

    數(shù)據(jù)查詢分析與SQL優(yōu)化實戰(zhàn)技巧

    今天,我將分享我在處理數(shù)千次數(shù)據(jù)庫性能問題中積累的實戰(zhàn)經(jīng)驗,幫助你系統(tǒng)掌握查詢分析與SQL優(yōu)化的核心技巧。無論你是剛入門的運維新手,還是有一定經(jīng)驗的工程師,這篇文章都將為你提供實用的解決方案。
    的頭像 發(fā)表于 09-08 09:34 ?1202次閱讀

    MySQL查詢終極優(yōu)化指南

    作為一名在生產(chǎn)環(huán)境摸爬滾打多年的運維工程師,我見過太多因為查詢導致的線上故障。今天分享一套經(jīng)過實戰(zhàn)檢驗的MySQL查詢分析與索引優(yōu)化方法論,幫你徹底解決
    的頭像 發(fā)表于 08-13 15:55 ?937次閱讀

    鴻蒙5開發(fā)寶藏案例分享---優(yōu)化應用時延問題

    ;gt; this.data = result) } 效果 : 4000條數(shù)據(jù)從 780ms → 172ms ! 注意 :小于1000條數(shù)據(jù)時差異不大,大數(shù)據(jù)量必用 ?** 案例3:數(shù)據(jù)
    發(fā)表于 06-13 10:08

    cypress3014怎么查看USB走線每幀傳輸?shù)膱D像數(shù)據(jù)量

    你好,請問怎么查看USB 走線每幀傳輸?shù)膱D像數(shù)據(jù)量
    發(fā)表于 05-14 06:12
    乐至县| 吉木萨尔县| 昂仁县| 大余县| 紫金县| 广宁县| 改则县| 安西县| 陕西省| 合阳县| 岐山县| 灵川县| 双峰县| 靖安县| 呼伦贝尔市| 黑山县| 马公市| 澄迈县| 邳州市| 兰坪| 柯坪县| 夏河县| 丹棱县| 菏泽市| 晋江市| 延庆县| 张家界市| 宜丰县| 石柱| 揭西县| 磴口县| 武胜县| 大名县| 平乐县| 安国市| 巫山县| 平泉县| 武汉市| 台北市| 瑞金市| 广南县|