mybatis-plus 查詢耗時慢問題
阿新 • • 發佈:2021-01-24
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