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

MyBatisPlus如何優(yōu)化千萬級數(shù)據(jù)的CRUD

 更新時間:2025年06月26日 16:23:18   作者:天天摸魚的java工程師  
最近負(fù)責(zé)的一個項目,數(shù)據(jù)庫表量級破千萬,每次執(zhí)行 CRUD 都像走鋼絲,稍有不慎就引起數(shù)據(jù)庫報警,本文就結(jié)合這個項目的實(shí)戰(zhàn)經(jīng)驗,聊聊 MyBatis Plus在千萬級數(shù)據(jù)場景下如何優(yōu)化 CRUD

背景

做 Java 開發(fā) 8 年,接觸過 Hibernate、JPA、MyBatis,到現(xiàn)在主力框架 MyBatis Plus(簡稱 MP)。一路踩坑無數(shù),從最初寫死 SQL 到現(xiàn)在用 Lambda 鏈?zhǔn)讲僮鳎杏|最深的是:CRUD 看似簡單,數(shù)據(jù)量一大,性能問題就來了。

最近負(fù)責(zé)的一個項目,數(shù)據(jù)庫表量級破千萬,每次執(zhí)行 CRUD 都像走鋼絲,稍有不慎就引起數(shù)據(jù)庫報警。本文就結(jié)合這個項目的實(shí)戰(zhàn)經(jīng)驗,聊聊 MyBatis Plus 在千萬級數(shù)據(jù)場景下如何優(yōu)化 CRUD 操作。

一、MyBatis Plus 簡介

MP 是 MyBatis 的增強(qiáng)工具,主打“無侵入、低門檻、強(qiáng)增強(qiáng)”,提供了一整套優(yōu)雅的 CRUD 封裝,尤其適合中后臺系統(tǒng)的開發(fā)。

但性能優(yōu)化這件事,MP 提供了鉤子,還得靠我們自己去掌握底層邏輯與場景判斷。

二、千萬級數(shù)據(jù)的挑戰(zhàn)

當(dāng)數(shù)據(jù)達(dá)到千萬級時,常見的問題有:

  • 查詢慢、分頁卡頓
  • 更新/刪除誤操作影響大
  • 數(shù)據(jù)遷移困難
  • 索引策略不合理
  • 樂觀鎖/悲觀鎖未啟用帶來并發(fā)問題

三、優(yōu)化 CRUD 的關(guān)鍵策略

下面我從 增、刪、改、查 四個維度,結(jié)合 MP 的用法,逐一拆解優(yōu)化策略。

1. 查詢優(yōu)化(Select)

使用分頁插件 + 索引優(yōu)化

Page<User> page = new Page<>(1, 10);
IPage<User> result = userMapper.selectPage(page, new QueryWrapper<User>()
        .eq("status", "active")
        .orderByDesc("create_time"));

優(yōu)化點(diǎn):

  • 創(chuàng)建復(fù)合索引 (status, create_time),避免文件排序
  • 設(shè)置合理的 limit 范圍,避開深分頁(推薦游標(biāo)分頁)

游標(biāo)分頁(Keyset Pagination)案例:

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.lt("id", lastId)
       .orderByDesc("id")
       .last("limit 100");

List<User> users = userMapper.selectList(wrapper);

比傳統(tǒng) OFFSET 分頁快得多,適合批量導(dǎo)出或加載。

2. 插入優(yōu)化(Insert)

批量插入代替單條插入

List<User> userList = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
    userList.add(new User("user" + i));
}
userMapper.insertBatchSomeColumn(userList); // 需自定義方法或 MyBatis 擴(kuò)展

建議:

  • 單次批量插入控制在 1000 條以內(nèi),避免 SQL 超長
  • 使用原生 JDBC 批處理,性能更優(yōu)

3. 更新優(yōu)化(Update)

避免全表更新

錯誤:

userMapper.update(null, new UpdateWrapper<User>().set("status", "inactive"));

優(yōu)化:

UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("status", "active");
wrapper.set("status", "inactive");
userMapper.update(null, wrapper);

永遠(yuǎn)記住:Update 要加條件!

樂觀鎖控制并發(fā)更新

@TableField(fill = FieldFill.UPDATE)
@Version
private Integer version;
user.setVersion(3);
userMapper.updateById(user); // MP 會自動加 version 判斷

4. 刪除優(yōu)化(Delete)

邏輯刪除替代物理刪除

@TableLogic
private Integer isDeleted;
userMapper.deleteById(123L); // 實(shí)際執(zhí)行的是 UPDATE 操作

邏輯刪除的優(yōu)勢:

  • 避免誤刪
  • 保留數(shù)據(jù)審計
  • 與回收站機(jī)制兼容

注意:邏輯刪除字段要加索引!

四、批處理與異步處理

在千萬級數(shù)據(jù)場景,批處理 + 異步化 是性能優(yōu)化的核心手段:

  • 使用 Stream 分批處理大數(shù)據(jù)集合
  • 配合 Spring Batch 或自定義線程池實(shí)現(xiàn)異步任務(wù)
  • 使用定時任務(wù)(如 XXL-JOB)分時段處理數(shù)據(jù)

五、數(shù)據(jù)庫層面的優(yōu)化建議

  • 合理建索引(避免過多/重復(fù)索引)
  • 垂直/水平分表(ShardingSphere、MyCat)
  • 使用中間件緩存熱點(diǎn)數(shù)據(jù)(Redis)
  • 慎用視圖和子查詢,優(yōu)先考慮 JOIN 重構(gòu)

六、總結(jié):CRUD 優(yōu)化是一場系統(tǒng)工程

MyBatis Plus 提供了優(yōu)雅的接口,但數(shù)據(jù)量上來之后,框架只是工具,根本還在底層 SQL 和設(shè)計策略上。

作為一個寫了 8 年 Java 的程序員,我最大的體會是:

性能不是調(diào)出來的,是設(shè)計出來的。

合理建模 + 規(guī)范使用 MP + 數(shù)據(jù)庫調(diào)優(yōu),才能讓你的系統(tǒng)在千萬級數(shù)據(jù)面前從容應(yīng)對。

到此這篇關(guān)于MyBatisPlus如何優(yōu)化千萬級數(shù)據(jù)的CRUD的文章就介紹到這了,更多相關(guān)MyBatisPlus優(yōu)化數(shù)據(jù)CRUD內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot之瘦身部署問題

    SpringBoot之瘦身部署問題

    這篇文章主要介紹了SpringBoot之瘦身部署問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • SpringBoot實(shí)現(xiàn)過濾器、攔截器與切片的實(shí)現(xiàn)和區(qū)別

    SpringBoot實(shí)現(xiàn)過濾器、攔截器與切片的實(shí)現(xiàn)和區(qū)別

    本文詳細(xì)介紹了使用過濾器、攔截器與切片實(shí)現(xiàn)每個請求耗時的統(tǒng)計,并比較三者的區(qū)別與聯(lián)系,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • Spring Boot啟動過程(五)之Springboot內(nèi)嵌Tomcat對象的start教程詳解

    Spring Boot啟動過程(五)之Springboot內(nèi)嵌Tomcat對象的start教程詳解

    這篇文章主要介紹了Spring Boot啟動過程(五)之Springboot內(nèi)嵌Tomcat對象的start的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 解決idea每次新建項目都需要重新指定maven目錄

    解決idea每次新建項目都需要重新指定maven目錄

    這篇文章主要介紹了解決idea每次新建項目都需要配置maven,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 詳解Java Bellman-Ford算法原理及實(shí)現(xiàn)

    詳解Java Bellman-Ford算法原理及實(shí)現(xiàn)

    Bellman-Ford算法與Dijkstra算法類似,都是以松弛操作作為基礎(chǔ),Bellman-Ford算法是對所有邊都進(jìn)行松弛操作,本文將詳解Bellman-Ford算法原理及實(shí)現(xiàn),感興趣的可以了解一下
    2022-07-07
  • java利用mybatis攔截器統(tǒng)計sql執(zhí)行時間示例

    java利用mybatis攔截器統(tǒng)計sql執(zhí)行時間示例

    這篇文章主要介紹了java利用mybatis攔截器統(tǒng)計sql執(zhí)行時間示例,該攔截器攔截mybatis的query和update操作,能統(tǒng)計sql執(zhí)行時間
    2014-03-03
  • java 通過cmd 調(diào)用命令啟動tomcat的操作

    java 通過cmd 調(diào)用命令啟動tomcat的操作

    這篇文章主要介紹了java 通過cmd 調(diào)用命令啟動tomcat的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • 基于Java實(shí)現(xiàn)Actor模型

    基于Java實(shí)現(xiàn)Actor模型

    Actor模型是一種常見的并發(fā)模型,與最常見的并發(fā)模型—共享內(nèi)存(同步鎖)不同,它將程序分為許多獨(dú)立的計算單元—Actor,文中有詳細(xì)的代碼示例,感興趣的同學(xué)可以參考閱讀
    2023-05-05
  • Spring-Boot框架初步搭建

    Spring-Boot框架初步搭建

    本篇文章主要介紹了Spring-Boot框架初步搭建,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Java泛型及類型校驗的應(yīng)用

    Java泛型及類型校驗的應(yīng)用

    泛型(Generics)是編程語言中的一種類型參數(shù)化機(jī)制,它允許在定義類、接口或方法時使用類型參數(shù),本文給大家介紹Java泛型及類型校驗的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧
    2026-03-03

最新評論

稻城县| 日照市| 景宁| 区。| 中阳县| 镶黄旗| 马关县| 营口市| 聊城市| 仪陇县| 辉县市| 永春县| 汾西县| 石嘴山市| 马龙县| 沧州市| 双鸭山市| 德化县| 观塘区| 山阳县| 卢氏县| 光泽县| 甘南县| 集贤县| 麻江县| 阆中市| 兴安盟| 岳阳县| 泗水县| 樟树市| 洛扎县| 敖汉旗| 承德县| 沅江市| 禄丰县| 扎囊县| 中宁县| 沁源县| 金门县| 来宾市| 泽州县|