91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

MyBatis Plus解決大數(shù)據(jù)量查詢(xún)慢問(wèn)題

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

掃碼添加小助手

加入工程師交流群

  • 常規(guī)查詢(xún)
  • 流式查詢(xún)
  • 游標(biāo)查詢(xún)

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

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

在實(shí)際工作中當(dāng)指定查詢(xún)數(shù)據(jù)過(guò)大時(shí),我們一般使用分頁(yè)查詢(xún)的方式一頁(yè)一頁(yè)的將數(shù)據(jù)放到內(nèi)存處理。但有些情況不需要分頁(yè)的方式查詢(xún)數(shù)據(jù)或分很大一頁(yè)查詢(xún)數(shù)據(jù)時(shí),如果一下子將數(shù)據(jù)全部加載出來(lái)到內(nèi)存中,很可能會(huì)發(fā)生OOM(內(nèi)存溢出);而且查詢(xún)會(huì)很慢,因?yàn)榭蚣芎馁M(fèi)大量的時(shí)間和內(nèi)存去把數(shù)據(jù)庫(kù)查詢(xún)的結(jié)果封裝成我們想要的對(duì)象(實(shí)體類(lèi))。

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

做法通常如下:

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

常規(guī)查詢(xún)

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

舉例:

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

@Mapper
publicinterfaceBigDataSearchMapperextendsBaseMapper<BigDataSearchEntity>{

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

}

注:該示例使用的 MybatisPlus

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

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

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

流式查詢(xún)

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

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

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

  • 執(zhí)行一個(gè)流式查詢(xún)后,數(shù)據(jù)庫(kù)訪問(wèn)框架就不負(fù)責(zé)關(guān)閉數(shù)據(jù)庫(kù)連接了,需要應(yīng)用在取完數(shù)據(jù)后自己關(guān)閉。
  • 必須先讀取(或關(guān)閉)結(jié)果集中的所有行,然后才能對(duì)連接發(fā)出任何其他查詢(xún),否則將引發(fā)異常。
MyBatis 流式查詢(xún)接口

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

  • Cursor 是可關(guān)閉的;
  • Cursor 是可遍歷的。

除此之外,Cursor 還提供了三個(gè)方法:

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

使用流式查詢(xún),則要保持對(duì)產(chǎn)生結(jié)果集的語(yǔ)句所引用的表的并發(fā)訪問(wèn),因?yàn)槠?查詢(xún)會(huì)獨(dú)占連接,所以必須盡快處理

為什么要用流式查詢(xún)?

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

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

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

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

游標(biāo)查詢(xún)

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

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

Mybatis 的處理加了兩個(gè)注解:@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:結(jié)果集的游標(biāo)只能向下滾動(dòng)
  • ResultSet.SCROLL_INSENSITIVE:結(jié)果集的游標(biāo)可以上下移動(dòng),當(dāng)數(shù)據(jù)庫(kù)變化時(shí),當(dāng)前結(jié)果集不變
  • ResultSet.SCROLL_SENSITIVE:返回可滾動(dòng)的結(jié)果集,當(dāng)數(shù)據(jù)庫(kù)變化時(shí),當(dāng)前結(jié)果集同步改變
  • fetchSize:每次獲取量

@ResultType

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

注意:返回類(lèi)型必須為 void ,因?yàn)椴樵?xún)的結(jié)果在 ResultHandler 里處理數(shù)據(jù),所以這個(gè) hander 也是必須的,可以使用 lambda 實(shí)現(xiàn)一個(gè)依次處理邏輯。

注意:

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

  • 方式一是多次查詢(xún),一次返回多條;
  • 方式二是一次查詢(xún),一次返回一條;

原因:

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

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

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

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

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

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    4020

    瀏覽量

    68369
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    906

    瀏覽量

    29560
  • 數(shù)據(jù)遷移
    +關(guān)注

    關(guān)注

    0

    文章

    89

    瀏覽量

    7261

原文標(biāo)題:MyBatis Plus 解決大數(shù)據(jù)量查詢(xún)慢問(wèn)題

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

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

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

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

    大數(shù)據(jù)平臺(tái)運(yùn)營(yíng)的基礎(chǔ)是什么

    在數(shù)聚股份看來(lái),越來(lái)越多的企業(yè)開(kāi)始搭建自己的大數(shù)據(jù)平臺(tái)體系,并傾注大量資源用于平臺(tái)的迭代和運(yùn)營(yíng)。那么大數(shù)據(jù)平臺(tái)作為越來(lái)越被關(guān)注的企業(yè)新興價(jià)值點(diǎn),它應(yīng)該以何種方式看待,并且以什么樣的方式去建設(shè)和運(yùn)營(yíng)
    的頭像 發(fā)表于 12-23 16:07 ?244次閱讀

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

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

    rt_sem_take卡住導(dǎo)致線程無(wú)法正常運(yùn)行怎么解決?

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

    淘寶/天貓:使用物流查詢(xún)API實(shí)時(shí)顯示包裹位置,減少客服咨詢(xún)

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

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

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

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

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

    求助,關(guān)于EVAL-AD7147數(shù)據(jù)存儲(chǔ)問(wèn)題求解

    . CDC Converter 環(huán)境下,無(wú)法儲(chǔ)存觸摸CDC值,只能存儲(chǔ)未觸摸CDC值。 2. 存儲(chǔ)下來(lái)的數(shù)據(jù)量與圖表數(shù)據(jù)量不符。 提問(wèn):如何采樣到觸摸CDC值,存儲(chǔ)下來(lái)的數(shù)據(jù)能否同圖表一致 硬件:EVAL-AD7147
    發(fā)表于 07-23 07:23

    鴻蒙5開(kāi)發(fā)寶藏案例分享---優(yōu)化應(yīng)用時(shí)延問(wèn)題

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

    HarmonyOS優(yōu)化應(yīng)用文件上傳下載問(wèn)題性能優(yōu)化一

    是立即的、模態(tài)界面的、同步的,跟隨應(yīng)用的生命周期,通常數(shù)據(jù)量較小、耗時(shí)短,例如發(fā)布微信朋友圈、微博,通常優(yōu)先級(jí)高且傾斜帶寬資源。后臺(tái)任務(wù)為可等待的、任意界面的、異步的,通常數(shù)據(jù)量較大、耗時(shí)長(zhǎng),例如緩存
    發(fā)表于 05-26 15:50

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

    你好,請(qǐng)問(wèn)怎么查看USB 走線每幀傳輸?shù)膱D像數(shù)據(jù)量
    發(fā)表于 05-14 06:12

    ClickHouse 的“獨(dú)孤九劍”:極速查詢(xún)的終極秘籍

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

    STM32F429以太網(wǎng)外設(shè)數(shù)據(jù)處理上限是多少?

    無(wú)法通信-通信延時(shí)-通信恢復(fù),wireshark數(shù)據(jù)暫未獲取到。 請(qǐng)幫忙分析以上現(xiàn)象是否為429的MAC核無(wú)法支持大數(shù)據(jù)量的沖刷,即使MAC過(guò)濾減輕了應(yīng)用層的壓力,在MAC硬件層仍會(huì)造成擁塞或某種溢出。謝謝
    發(fā)表于 03-13 06:52

    【解碼CITE2025】全球數(shù)字化變局中的&quot;中國(guó)突圍&quot;:本土科技巨頭如何重構(gòu)產(chǎn)業(yè)新生態(tài)

    與技術(shù)雙輪驅(qū)動(dòng)的繁榮格局。 隨著數(shù)據(jù)量指數(shù)級(jí)增長(zhǎng),全球大數(shù)據(jù)存儲(chǔ)市場(chǎng)呈現(xiàn)出迅猛的擴(kuò)張態(tài)勢(shì),物聯(lián)網(wǎng)設(shè)備的廣泛普及、AI訓(xùn)練對(duì)海量數(shù)據(jù)的需求以及企業(yè)數(shù)字化轉(zhuǎn)型的加速,全球數(shù)據(jù)量邁向200Z
    發(fā)表于 03-10 15:06 ?412次閱讀
    【解碼CITE2025】全球數(shù)字化變局中的&quot;中國(guó)突圍&quot;:本土科技巨頭如何重構(gòu)產(chǎn)業(yè)新生態(tài)