Java连MySQL性能调优(batch insert和连续left join筛选)

以前一个数据校验功能遇到严重性能瓶颈java

插入数据竟然须要22秒,优化后0.38秒mysql

一个联合join校验须要42秒,优化后1.87秒spring

一个增删改对比显示union的sql须要49秒,优化后1.023秒sql

 

一、首先是batch的问题:数据库

  在本项目中,使用了org.springframework.jdbc.core.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秒,速度提高明显。spa

 

二、接着是一个联合join的校验问题。code

  项目需求一个3表join,以左表为基准,进行2次连续的left join且附带筛选条件。调优前运行缓慢,须要44秒。

  原先采用一条sql解决全部问题,后改成首先用3条sql将3个表的最新记录筛选下来,再用Map<String, List<String> >数据结构记录key和重复的项,遍历进行java式的join,因为所有运算基于hashmap且在内存中运行,速度很是快

  调优后速度变为1.87秒

 

三、最后是个增删改对比显示的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 = mapA.get(key);

        if (mapB.containsKey(key)) {
                String[] bVal = mapB.get(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);
                }
                mapBadd.remove(key);
        } else {
                // A里面有的,B没有的
                mapBdel.put(key, val);
        }
}

  优化后仅须要1.023秒,很是快。

相关文章
相关标签/搜索