Java连MySQL性能调优(batchinsert和连续leftjoin筛选)之前⼀个数据校验功能遇到严重性能瓶颈
插⼊数据居然需要22秒,优化后0.38秒
⼀个联合join校验需要42秒,优化后1.87秒
⼀个增删改对⽐显⽰union的sql需要49秒,优化后1.023秒
1、⾸先是batch的问题:
在本项⽬中,使⽤了org.JdbcTemplate类作为数据库链接服务。批量插⼊时,调⽤
jdbcTemplate.batchUpdate⽅法进⾏批量插⼊,然⽽插⼊速度不尽如⼈意,⾮常缓慢。问题点在于,明明使⽤了batchUpdate⽽不是逐条插⼊,为何会出现插⼊缓慢的问题呢?
原来在链接MySQL的时候,并没有设置⾃动合并多个insert的功能,导致还是变成了逐条插⼊。正确的⽅式是,修改MySQL链接参数,添加关键字段rewriteBatchedStatements=true,详细如下:
jdbc:mysql://test_host:3306/test_schemas1?useUnicode=true&characterEncoding=utf-
8&autoReconnect=true&rewriteBatchedStatements=true
添加这个rewriteBatchedStatements参数设置后,batch插⼊从原来的22秒变成了0.38秒,速度提升明显。
2、接着是⼀个联合join的校验问题。
项⽬需求⼀个3表join,以左表为基准,进⾏2次连续的left join且附带筛选条件。调优前运⾏缓慢,需要44秒。
原先采⽤⼀条sql解决所有问题,后改为⾸先⽤3条sql将3个表的最新记录筛选下来,再⽤Map<String, List<String> >数据结构记录key和重复的项,遍历进⾏java式的join,由于全部运算基于hashmap且在内存中运⾏,速度⾮常快
调优后速度变为1.87秒
多表left join3、最后是个增删改对⽐显⽰的sql问题
这段SQL的原来思路是先left join,右表为null的就是相对右表新增的;再inner join,把对⽐修改的字段都判断⼀遍,不全相等的就是左表相对右表更改的;最后再right join,把左表为null的筛出来,说明
这是左表相对右表删除的。最后最后,把3个查出来的结果再union起来。整个查询时间⾮常漫长,需要49秒。
优化后的代码,将左表和右表分别⽤DAO载下来,然后通过HashMap来进⾏对⽐,⼤致代码如下:
Map<String, String[]> mapA = dbData; Map<String, String[]> mapB = upload; Map<String, String[]> mapBadd = new HashMap<String, String[]>(mapB); Map<String, String[]> mapBdel = new HashMap<String, String[]>(); Map<String, String[]> mapBchange = new HashMap<String, String[]>(); Iterator<String> it = mapA.keySet().iterator();while
(it.hasNext()) { String key = it.next(); String[] val = (key); if (ainsKey(key)) { String[] bVal =
<(key); if (val != null && val.equals(bVal) || Arrays.equals(val, bVal)) { } else { String[] changeVal = new
String[val.length + bVal.length]; System.arraycopy(val, 0, changeVal, 0, val.length); System.arraycopy(bVal, 0,
changeVal, val.length, bVal.length); mapBchange.put(key, changeVal); } ve(key); } els
e { // A⾥⾯有的,B 没有的 mapBdel.put(key, val); } }
优化后仅需要1.023秒,⾮常快。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论