溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何解決mybatis-plus查詢耗時慢的問題

發(fā)布時間:2021-07-05 09:39:28 來源:億速云 閱讀:859 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹如何解決mybatis-plus查詢耗時慢的問題,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

mybatis-plus 查詢耗時慢

1、現(xiàn)象

查出30000多條id

然后用

EntityWrapper ew = new EntityWrapper<>();
 ew.in(TableFieldConstant.F_AUTH_RESULT_ID, ids);

查詢會很慢

2、原因

跟了一下mybatis-plus源碼

 protected String formatSqlIfNeed(boolean need, String sqlStr, Object... params) {
        if (need && !StringUtils.isEmpty(sqlStr)) {
            if (ArrayUtils.isNotEmpty(params)) {
                for(int i = 0; i < params.length; ++i) {
                    String genParamName = "MPGENVAL" + this.paramNameSeq.incrementAndGet();
                    sqlStr = sqlStr.replace(String.format("{%s}", i), String.format("#{%s.paramNameValuePairs.%s}", this.getParamAlias(), genParamName));
                    this.paramNameValuePairs.put(genParamName, params[i]);
                }
            }
 
            return sqlStr;
        } else {
            return null;
        }
    }

問題出現(xiàn)在

sqlStr = sqlStr.replace(String.format("{%s}", i), String.format("#{%s.paramNameValuePairs.%s}", this.getParamAlias(), genParamName));

對replace 測試 發(fā)現(xiàn)當(dāng)數(shù)據(jù)量大時替換會很耗時 測試的遍歷了30000次拼接從1到30000 替換耗時20多秒

對 apache-commons-lang 的StringUtis.replace測試是耗時7秒多

3、總結(jié)

把使用mybaits 批量查詢改為 手寫sql查詢 之后問題解決

使用mybatis-plus批量操作時要謹慎 能寫sql盡量寫sql

這個跟mybatis-plus 的小伙伴提了問題后已經(jīng)解決 可以升級jar版本 3.x

mybatis-plus 處理大數(shù)據(jù)量太慢

大批量數(shù)據(jù)插入方法是Mybatis的foreach拼接SQL

我發(fā)現(xiàn)不管改成Mybatis Batch提交或者原生JDBC Batch的方法都不起作用,實際上在插入的時候仍然是一條條記錄的插,速度遠不如原來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);
 }

1、就是這樣的一種情景也很符合大部分的開發(fā)場景,可就是1000條數(shù)據(jù)的情況下用了8秒 ,這可能與計算機的性能有很大的關(guān)系,但就是如此也不至于用八秒鐘,那么用戶體驗會很慘的。

2、JDBC連接URL字符串中需要新增一個參數(shù):

rewriteBatchedStatements=true url: jdbc:mysql://192.168.1.143:3306/rt_xxxxxx_test?useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true

3、MySQL的JDBC連接的url中要加rewriteBatchedStatements參數(shù),并保證5.1.13以上版本的驅(qū)動,才能實現(xiàn)高性能的批量插入。

4、MySQL JDBC驅(qū)動在默認情況下會無視executeBatch()語句,把我們期望批量執(zhí)行的一組sql語句拆散,一條一條地發(fā)給MySQL數(shù)據(jù)庫,批量插入實際上是單條插入,直接造成較低的性能。

只有把rewriteBatchedStatements參數(shù)置為true, 驅(qū)動才會幫你批量執(zhí)行SQL

另外這個選項對INSERT/UPDATE/DELETE都有效

以上是“如何解決mybatis-plus查詢耗時慢的問題”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI