您好,登錄后才能下訂單哦!
這篇文章給大家介紹mybatis-plus中大數(shù)據(jù)插入太慢如何解決,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
我發(fā)現(xiàn)不管改成Mybatis Batch提交或者原生JDBC Batch的方法都不起作用,實(shí)際上在插入的時(shí)候仍然是一條條記錄的插,速度遠(yuǎn)不如原來(lái)Mybatis的foreach拼接SQL的方法。
// 第一步判斷更新或添加 String[] splitUserId = userGroup.getUserId().split(","); String[] spiltUserName = userGroup.getUserName().split(","); if (StringUtils.isBlank(userGroup.getId())) { userGroup.setNum(spiltUserName.length); userGroupMapper.insert(userGroup); } else { userGroup.setNum(spiltUserName.length); userGroupMapper.updateById(userGroup); } /* 第二部刪除中間表信息,字段冗余 */ Map<String, Object> columnMap = new HashMap<String, Object>(); columnMap.put("USER_GROUP_ID", userGroup.getId()); groupUsersService.removeByMap(columnMap); /* 第三步,批量保存中間表 */ if (splitUserId.length != 0) { List<GroupUsers> groupUsersList = Lists.newArrayList(); for (int i = 0; i < splitUserId.length; i++) { GroupUsers gu = new GroupUsers(); gu.setUserId(splitUserId[i]); gu.setUserName(spiltUserName[i]); gu.setUserGroupId(userGroup.getId()); groupUsersList.add(gu); } groupUsersService.saveBatch(groupUsersList); }
就是這樣的一種情景也很符合大部分的開(kāi)發(fā)場(chǎng)景,可就是1000條數(shù)據(jù)的情況下用了8秒 ,這可能與計(jì)算機(jī)的性能有很大的關(guān)系,但就是如此也不至于用八秒鐘,那么用戶體驗(yàn)會(huì)很慘的。
JDBC連接URL字符串中需要新增一個(gè)參數(shù):rewriteBatchedStatements=true url: jdbc:mysql://192.168.1.143:3306/rt_xxxxxx_test?useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true
MySQL的JDBC連接的url中要加rewriteBatchedStatements參數(shù),并保證5.1.13以上版本的驅(qū)動(dòng),才能實(shí)現(xiàn)高性能的批量插入。
MySQL JDBC驅(qū)動(dòng)在默認(rèn)情況下會(huì)無(wú)視executeBatch()語(yǔ)句,把我們期望批量執(zhí)行的一組sql語(yǔ)句拆散,一條一條地發(fā)給MySQL數(shù)據(jù)庫(kù),批量插入實(shí)際上是單條插入,直接造成較低的性能。
只有把rewriteBatchedStatements參數(shù)置為true, 驅(qū)動(dòng)才會(huì)幫你批量執(zhí)行SQL
另外這個(gè)選項(xiàng)對(duì)INSERT/UPDATE/DELETE都有效
最近項(xiàng)目用的mybatis-plus做的映射,有個(gè)批處理文件內(nèi)容的需求,在使用mybatis-plus的批處理方法saveBatch時(shí)發(fā)現(xiàn)速度特別慢,測(cè)試從1000到10000到80000條基本上是線性增加,80000條時(shí)差不多要90秒。
經(jīng)debug排查sql語(yǔ)句是批量執(zhí)行,所以應(yīng)該不是框架本身的問(wèn)題,由于用的是公司的手腳架,在mysql連接配置中發(fā)現(xiàn)了問(wèn)題
這里少配置了一個(gè)參數(shù)rewriteBatchedStatements=true
結(jié)果
修改前24w數(shù)據(jù)大概在254709 ms
修改后24w數(shù)據(jù)大概在42506 ms
單次批量插入10000條大概在1700ms
關(guān)于mybatis-plus中大數(shù)據(jù)插入太慢如何解決就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。