最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis Plus大數(shù)據(jù)量查詢慢原因分析及解決

 更新時(shí)間:2025年09月21日 15:52:05   作者:night_gu  
大數(shù)據(jù)量查詢慢常因全表掃描、分頁(yè)不當(dāng)、索引缺失、內(nèi)存占用高及ORM開銷,優(yōu)化措施包括分頁(yè)查詢、流式讀取、SQL優(yōu)化、批處理、多數(shù)據(jù)源、結(jié)果集二次處理及配置調(diào)優(yōu)

大數(shù)據(jù)量查詢慢的常見(jiàn)原因

MyBatis Plus 在處理大數(shù)據(jù)量查詢時(shí),性能瓶頸通常出現(xiàn)在數(shù)據(jù)庫(kù)連接、網(wǎng)絡(luò)傳輸、內(nèi)存消耗和結(jié)果集處理等方面。

常見(jiàn)問(wèn)題包括全表掃描、未合理使用分頁(yè)、ORM 映射開銷過(guò)大等。

優(yōu)化方案

合理使用分頁(yè)查詢

MyBatis Plus 內(nèi)置分頁(yè)插件(PaginationInnerInterceptor),避免一次性加載全部數(shù)據(jù)。

配置示例:

@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

查詢時(shí)通過(guò) Page 對(duì)象分頁(yè):

Page<User> page = new Page<>(1, 100); // 當(dāng)前頁(yè), 每頁(yè)條數(shù)
userMapper.selectPage(page, null);

啟用流式查詢

通過(guò) @Options 注解啟用 JDBC 流式讀取,減少內(nèi)存占用:

@Select("SELECT * FROM large_table")
@Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 1000)
@ResultType(User.class)
void selectLargeData(ResultHandler<User> handler);

使用游標(biāo)處理結(jié)果

結(jié)合 MyBatis 的 Cursor 逐行處理數(shù)據(jù):

try (Cursor<User> cursor = userMapper.selectCursor(null)) {
    cursor.forEach(user -> {
        // 單行處理邏輯
    });
}

SQL 語(yǔ)句優(yōu)化

添加必要的索引,避免 SELECT *,只查詢必要字段。通過(guò) @SqlParser 注解過(guò)濾邏輯刪除等干擾:

@SqlParser(filter = true)
@Select("SELECT id, name FROM user WHERE status = 1")
List<User> selectActiveUsers();

批處理操作

插入/更新時(shí)使用 saveBatch 方法,通過(guò) rewriteBatchedStatements=true 參數(shù)提升批量性能:

List<User> userList = ... // 大數(shù)據(jù)集合
userService.saveBatch(userList, 1000); // 每批1000條

高級(jí)方案

多數(shù)據(jù)源與讀寫分離

通過(guò) @DS 注解將查詢路由到從庫(kù),減輕主庫(kù)壓力:

@DS("slave")
@Select("SELECT * FROM read_heavy_table")
List<Record> selectReadHeavyData();

結(jié)果集二次處理

在內(nèi)存充足的情況下,先通過(guò) LIMIT 分頁(yè)查詢 ID,再通過(guò) IN 查詢完整數(shù)據(jù):

-- 第一步:查詢ID范圍
SELECT id FROM large_table LIMIT 1000000, 1000;
-- 第二步:精確獲取數(shù)據(jù)
SELECT * FROM large_table WHERE id IN (1,2,3...);

配置調(diào)優(yōu)

application.yml 中調(diào)整連接池參數(shù):

spring:
  datasource:
    hikari:
      maximum-pool-size: 20
      connection-timeout: 30000
      idle-timeout: 600000
      max-lifetime: 1800000

監(jiān)控與診斷

啟用 p6spy 監(jiān)控實(shí)際執(zhí)行的 SQL,分析慢查詢?nèi)罩荆?/p>

<dependency>
    <groupId>p6spy</groupId>
    <artifactId>p6spy</artifactId>
    <version>3.9.1</version>
</dependency>

配置 spy.properties 記錄執(zhí)行時(shí)間:

appender=com.p6spy.engine.spy.appender.Slf4JLogger
logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat
customLogMessageFormat=%(executionTime) ms | %(category) | %(sql)

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 在SpringBoot微服務(wù)中設(shè)置和管理多個(gè)數(shù)據(jù)庫(kù)的代碼示例

    在SpringBoot微服務(wù)中設(shè)置和管理多個(gè)數(shù)據(jù)庫(kù)的代碼示例

    在現(xiàn)代微服務(wù)架構(gòu)中,通常需要與多個(gè)數(shù)據(jù)庫(kù)交互的服務(wù),這可能是由于各種原因,例如遺留系統(tǒng)集成、不同類型的數(shù)據(jù)存儲(chǔ)需求,或者僅僅是為了優(yōu)化性能,在本綜合指南中,我們將探討如何在 Spring Boot 微服務(wù)中設(shè)置和管理多個(gè)數(shù)據(jù)庫(kù)連接,需要的朋友可以參考下
    2024-12-12
  • Spring外部化配置的幾種技巧分享

    Spring外部化配置的幾種技巧分享

    在油管上看了龍之春的一個(gè)Spring tips 視頻,講述Spring外部化配置的幾種技巧,收獲頗多,想拿出來(lái)給大家分享下。對(duì)spring感興趣的朋友可以了解下本文
    2021-06-06
  • Elasticsearch配置文件選項(xiàng)作用詳解(es7)

    Elasticsearch配置文件選項(xiàng)作用詳解(es7)

    這篇文章主要為大家介紹了Elasticsearch配置文件選項(xiàng)作用詳解(es7),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Spring事務(wù)管理中的異?;貪L是什么

    Spring事務(wù)管理中的異?;貪L是什么

    Spring中的代碼出現(xiàn)異常時(shí)會(huì)回滾這是大家都希望的情況,這時(shí)候可以用@Transactional這個(gè)注解放在你的方法上來(lái)進(jìn)行回滾,這時(shí)候有個(gè)問(wèn)題就是事務(wù)回滾是不希望你在Controller進(jìn)行處理,而是在Service層來(lái)進(jìn)行處理
    2023-02-02
  • ActiveMQ持久化機(jī)制代碼實(shí)例

    ActiveMQ持久化機(jī)制代碼實(shí)例

    這篇文章主要介紹了ActiveMQ持久化機(jī)制代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java ThreadLocal 線程本地存儲(chǔ)工具思路詳解

    Java ThreadLocal 線程本地存儲(chǔ)工具思路詳解

    文章詳細(xì)介紹了Java的ThreadLocal類,包括其核心作用、定位、特性、工作原理、用法、內(nèi)存泄漏風(fēng)險(xiǎn)、父子線程共享問(wèn)題、線程安全邊界以及與synchronized和并發(fā)容器的區(qū)別,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • file.mkdir()、file.mkdirs()和file.createNewFile()的區(qū)別

    file.mkdir()、file.mkdirs()和file.createNewFile()的區(qū)別

    本文主要介紹了file.mkdir()、file.mkdirs()和file.createNewFile()的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • RabbitMQ進(jìn)階之消息可靠性詳解

    RabbitMQ進(jìn)階之消息可靠性詳解

    這篇文章主要介紹了RabbitMQ進(jìn)階之消息可靠性詳解,abbitmq消息的投遞過(guò)程中,怎么確保消息能不丟失,這是一個(gè)很重要的問(wèn)題,哪怕我們做了Rabbitmq持久化,也不能保證我們的業(yè)務(wù)消息不會(huì)被丟失,需要的朋友可以參考下
    2023-08-08
  • 基于mybatis一對(duì)多查詢內(nèi)層排序的問(wèn)題

    基于mybatis一對(duì)多查詢內(nèi)層排序的問(wèn)題

    這篇文章主要介紹了基于mybatis一對(duì)多查詢內(nèi)層排序的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • SpringBoot整合EasyExcel進(jìn)行大數(shù)據(jù)處理的方法詳解

    SpringBoot整合EasyExcel進(jìn)行大數(shù)據(jù)處理的方法詳解

    EasyExcel是一個(gè)基于Java的簡(jiǎn)單、省內(nèi)存的讀寫Excel的開源項(xiàng)目。在盡可能節(jié)約內(nèi)存的情況下支持讀寫百M(fèi)的Excel。本文將在SpringBoot中整合EasyExcel進(jìn)行大數(shù)據(jù)處理,感興趣的可以了解一下
    2022-05-05

最新評(píng)論

烟台市| 宜城市| 延寿县| 绥棱县| 新闻| 景东| 乐平市| 新乐市| 都匀市| 长沙县| 旬邑县| 姜堰市| 疏勒县| 子长县| 遂昌县| 昭觉县| 海淀区| 龙井市| 政和县| 东方市| 镇远县| 弥勒县| 新干县| 永吉县| 尚志市| 精河县| 岳普湖县| 永兴县| 镇平县| 广东省| 海伦市| 比如县| 昌宁县| 南充市| 普宁市| 合江县| 纳雍县| 兰坪| 加查县| 巴彦淖尔市| 杨浦区|