色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

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

jf_ro2CN3Fa ? 來源:CSDN ? 2023-01-16 10:17 ? 次閱讀

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

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

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

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

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

做法通常如下:

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

常規(guī)查詢

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

舉例:

假設(shè)單表 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ù)庫服務(wù)器就噶皮了,或者你能等上幾十分鐘或幾小時,甚至幾天時間檢索數(shù)據(jù)

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

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

流式查詢

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

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

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

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

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

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

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

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

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

為什么要用流式查詢?

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

分庫分表場景下,單個表的查詢結(jié)果集雖然不大,但如果某個查詢跨了多個庫多個表,又要做結(jié)果集的合并、排序等動作,依然有可能撐爆內(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)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

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

游標(biāo)查詢

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

當(dāng)查詢百萬級的數(shù)據(jù)的時候,還可以使用游標(biāo)方式進行數(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:結(jié)果集的游標(biāo)只能向下滾動
  • ResultSet.SCROLL_INSENSITIVE:結(jié)果集的游標(biāo)可以上下移動,當(dāng)數(shù)據(jù)庫變化時,當(dāng)前結(jié)果集不變
  • ResultSet.SCROLL_SENSITIVE:返回可滾動的結(jié)果集,當(dāng)數(shù)據(jù)庫變化時,當(dāng)前結(jié)果集同步改變
  • fetchSize:每次獲取量

@ResultType

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

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

注意:

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

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

原因:

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

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

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

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

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

審核編輯 :李倩


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

    關(guān)注

    7

    文章

    3842

    瀏覽量

    64579
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    826

    瀏覽量

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

    關(guān)注

    0

    文章

    72

    瀏覽量

    6963

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

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

    緩存對大數(shù)據(jù)處理的影響分析

    緩存對大數(shù)據(jù)處理的影響顯著且重要,主要體現(xiàn)在以下幾個方面: 一、提高數(shù)據(jù)訪問速度 在大數(shù)據(jù)環(huán)境中,數(shù)據(jù)存儲通常采用分布式存儲系統(tǒng),數(shù)據(jù)量龐大
    的頭像 發(fā)表于 12-18 09:45 ?217次閱讀

    Mybatis 攔截器實現(xiàn)單數(shù)據(jù)源內(nèi)多數(shù)據(jù)庫切換

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

    emc技術(shù)在大數(shù)據(jù)分析中的角色

    在當(dāng)今這個數(shù)據(jù)驅(qū)動的世界中,大數(shù)據(jù)分析已經(jīng)成為企業(yè)獲取洞察力、優(yōu)化業(yè)務(wù)流程和提高競爭力的關(guān)鍵工具。隨著數(shù)據(jù)量的爆炸性增長,企業(yè)面臨著如何有效存儲、處理和分析這些數(shù)據(jù)的挑戰(zhàn)。 1.
    的頭像 發(fā)表于 11-01 15:22 ?311次閱讀

    大數(shù)據(jù)從業(yè)者必知必會的Hive SQL調(diào)優(yōu)技巧

    大數(shù)據(jù)從業(yè)者必知必會的Hive SQL調(diào)優(yōu)技巧 摘要 :在大數(shù)據(jù)領(lǐng)域中,Hive SQL被廣泛應(yīng)用于數(shù)據(jù)倉庫的數(shù)據(jù)查詢和分析。然而,由于數(shù)據(jù)量
    的頭像 發(fā)表于 09-24 13:30 ?307次閱讀

    獨家探秘!Datasheet5背后的大數(shù)據(jù)機制

    現(xiàn)在市面上林林總總、各式各樣的數(shù)據(jù)手冊網(wǎng)站,國內(nèi)的,國外的,并不少,也都號稱運用大數(shù)據(jù)智能匹配和運算,為工程師提供數(shù)據(jù)手冊查詢、器件參數(shù),應(yīng)用等等等等。
    的頭像 發(fā)表于 08-26 17:24 ?385次閱讀
    獨家探秘!Datasheet5背后的<b class='flag-5'>大數(shù)據(jù)</b>機制

    使用mybatis切片實現(xiàn)數(shù)據(jù)權(quán)限控制

    一、使用方式 數(shù)據(jù)權(quán)限控制需要對查詢出的數(shù)據(jù)進行篩選,對業(yè)務(wù)入侵最少的方式就是利用mybatis或者數(shù)據(jù)庫連接池的切片對已有業(yè)務(wù)的sql進行
    的頭像 發(fā)表于 07-09 17:26 ?416次閱讀
    使用<b class='flag-5'>mybatis</b>切片實現(xiàn)<b class='flag-5'>數(shù)據(jù)</b>權(quán)限控制

    ESP8266_RTOS3.0串口0傳輸大量數(shù)據(jù)丟包的原因?

    多個分段進入處理函數(shù),后來使用example示例中的uart_echo,發(fā)現(xiàn)接收可以完整接收,但是當(dāng)把數(shù)據(jù)原樣從串口0的tx輸出時,數(shù)據(jù)中間出現(xiàn)多次中斷丟包。 我發(fā)現(xiàn)用系統(tǒng)自帶的打印log的函數(shù)打印數(shù)據(jù)時,并不會出現(xiàn)丟包情況。
    發(fā)表于 07-09 06:32

    CC2640R2F BLE如何實現(xiàn)一次連接事件傳輸?shù)?b class='flag-5'>數(shù)據(jù)量為500字節(jié),或者更大?

    您好,我想實現(xiàn)一次連接事件傳輸?shù)?b class='flag-5'>數(shù)據(jù)量為500字節(jié),或者更大。是如何實現(xiàn)的? MTU設(shè)置成255,應(yīng)該是可以傳輸251字節(jié)數(shù)據(jù)。MAX_NUM_PDU設(shè)置成5,應(yīng)該可以傳送251*5=1255字節(jié)吧?目前傳輸超過251字節(jié)的數(shù)據(jù)
    發(fā)表于 05-30 06:12

    藍牙Mesh模塊多跳大數(shù)據(jù)量高帶寬傳輸數(shù)據(jù)方法

    通過多個跳數(shù)進行通信,從而實現(xiàn)大范圍的覆蓋。然而,隨著數(shù)據(jù)量的增加和帶寬需求的提高,如何在藍牙Mesh網(wǎng)絡(luò)中實現(xiàn)高效、穩(wěn)定的多跳大數(shù)據(jù)量高帶寬傳輸數(shù)據(jù)成為了一個亟待解決的問題。本文將介紹一種基于藍牙Mesh模塊的多跳
    的頭像 發(fā)表于 05-28 11:23 ?820次閱讀
    藍牙Mesh模塊多跳<b class='flag-5'>大數(shù)據(jù)量</b>高帶寬傳輸<b class='flag-5'>數(shù)據(jù)</b>方法

    STM32F302使用ADC+DMA的方案,采集大數(shù)據(jù)出錯怎么解決?

    我先列一下我的幾組測試對比。現(xiàn)在手頭有一塊303的,一塊302的.一、303的片子:基本參數(shù) ,AD時鐘36MHZ,采樣時間7.5Cycles,定時器觸發(fā)時間4.16us。采集大數(shù)據(jù)量波形不失
    發(fā)表于 04-25 08:31

    大數(shù)據(jù)時代的存儲革命:理解分布式存儲系統(tǒng)

    在如今的大數(shù)據(jù)時代,全球數(shù)據(jù)量正在以指數(shù)型增長。據(jù)國際數(shù)據(jù)公司(IDC)預(yù)測,到2025年,全球數(shù)據(jù)量將增至175 ZB。這種海量的數(shù)據(jù)存儲
    的頭像 發(fā)表于 03-07 15:40 ?456次閱讀

    分布式存儲與計算:大數(shù)據(jù)時代的解決方案

    我們正生活在一個數(shù)據(jù)驅(qū)動的時代,數(shù)據(jù)量以前所未有的速度呈指數(shù)型增長。IDC預(yù)測到2025年全球數(shù)據(jù)量將達到175ZB(Zettabytes)。面對如此龐大的數(shù)據(jù),傳統(tǒng)的集中式存儲顯然已
    的頭像 發(fā)表于 03-07 14:42 ?833次閱讀

    MySQL單表數(shù)據(jù)量限制:為何2000萬行成為瓶頸?

    很多人認為:數(shù)據(jù)量超過500萬行或2000萬行時,引起B(yǎng)+tree的高度增加,延長了索引的搜索路徑,進而導(dǎo)致了性能下降。事實果真如此嗎?
    的頭像 發(fā)表于 02-27 10:38 ?6659次閱讀
    MySQL單表<b class='flag-5'>數(shù)據(jù)量</b>限制:為何2000萬行成為瓶頸?

    大數(shù)據(jù)技術(shù)是干嘛的 大數(shù)據(jù)核心技術(shù)有哪些

    的核心技術(shù),包括數(shù)據(jù)采集、存儲與管理、處理與分析等方面。 一、大數(shù)據(jù)技術(shù)背景和概念 1.1 背景 隨著互聯(lián)網(wǎng)技術(shù)的迅猛發(fā)展,人們可以通過各種途徑產(chǎn)生、獲取和傳輸數(shù)據(jù),使數(shù)據(jù)量呈現(xiàn)爆炸式
    的頭像 發(fā)表于 01-31 11:07 ?3749次閱讀
    主站蜘蛛池模板: 亚洲 欧美 国产 视频二区| 无人区日本电影在线观看高清| 日日日夜夜在线视频| 97人人碰免费视频公开| 久久精品麻豆国产天美传媒果冻| 无码AV精品一区二区三区| 国产AV果冻传奇麻豆| 色综合a在线| 国产超碰精久久久久久无码AV | 跪趴式啪啪GIF动态图27报| 青柠视频在线观看高清HD| 草草久久久亚洲AV成人片 | 日日干夜夜啪蕉视频| 成人免费看片又大又黄| 日韩欧美亚洲精品综合在线| 高清日本片免费观看| 网红主播 国产精品 开放90后| 国产精品一久久香蕉国产线看| 性夜a爽黄爽| 精品精品国产yyy5857香蕉| 中文字幕无码他人妻味| 男生jj插入女生jj| 观看免费做视频| 亚洲成在人线视频| 久久99精品国产自在自线| 91精品国产色综合久久| 日本久久高清视频| 国产色偷偷男人的天堂| 一区两区三不卡| 免费精品美女久久久久久久久久| jjzzz日本| 香蕉精品国产自在现线拍| 精品国产乱码久久久久久上海公司| 伊人成色综合人网| 欧美精品成人a多人在线观看| 福利免费观看体检区| 亚洲欧美自拍清纯中文字幕| 久久怡红院国产精品| 朝鲜女人性猛交| 亚洲免费在线视频| 欧美高跟镣铐bdsm视频|