1. 程式人生 > 其它 >mybatis-plus 查詢耗時慢問題

mybatis-plus 查詢耗時慢問題

技術標籤:mybatis-plus 遇到的問題java

1.現象

查出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;
        }
    }

問題出現在

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

對replace 測試 發現當資料量大時替換會很耗時 測試的遍歷了30000次拼接從1到30000 替換耗時20多秒

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

3總結

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

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