文档章节

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

flash胜龙
 flash胜龙
发布于 08/10 15:15
字数 787
阅读 15
收藏 5

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

插入数据居然需要22秒,优化后0.38秒

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

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

 

1、首先是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秒,速度提升明显。

 

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

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

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

  调优后速度变为1.87秒

 

3、最后是个增删改对比显示的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秒,非常快。

 

© 著作权归作者所有

共有 人打赏支持
flash胜龙
粉丝 2
博文 26
码字总数 16281
作品 0
海淀
私信 提问
加载中

评论(2)

踏破铁鞋无觅处
踏破铁鞋无觅处
Java的join比数据库join效率高吗?
大量数据和少量数据区别明显吗
哈哈小猪
哈哈小猪
join查询对于结果数据只有时间节点吗,左表关联的数据如果涉及到右表的数据,这个好像不行吧
MySQL JDBC 的 BATCH 执行和 rewriteBatchedStatements 参数

本来以为这是一个已解决的问题,但是发现有同学不知道,所以写一下。 经常使用 MySQL 的同学可能知道,默认情况下 MySQL JDBC 驱动是不支持 BATCH 的: 在真正执行的时候,MySQL JDBC 驱动仍...

长源
08/01
0
0
大型互联网架构必备技术——性能调优专题

性能调优 深入内核,直击故障 ,拒绝蒙圈 性能优化如何理解 1、性能基准 2、什么是性能优化 3、衡量标准 JVM调优 1、Jvm虚拟机内存剖析 2、垃圾收集器 3、实战调优案例与解决方案 4、Jvm运行...

Java高级架构
04/15
0
0
Mysql与Couchbase之区别!!

一、数据模型不同 Mysql customer id: numeric primary key firstname: varchar lastname: varchar customer_address id: numeric primary key city: varchar state: varchar zip: varchar c......

59090939
06/26
0
0
Spring-Batch处理MySQL数据后存到CSV文件

1 介绍 用Spring Batch实现了个简单的需求,从MySQL中读取用户表数据,根据生日计算年龄,将结果输出到csv文件。 1.1 准备表及数据 2 实现 2.1 项目目录 2.2 实体类 2.3 ItemReader TestUse...

yysue
05/26
0
0
《成神之路-基础篇》JVM——JVM参数及调优(已完结)

Java内存模型,Java内存管理,Java堆和栈,垃圾回收 本文是[《成神之路系列文章》][1]的第一篇,主要是关于JVM的一些介绍。 持续更新中 JVM参数及调优 JVM实用参数系列 成为Java GC专家(5)...

05/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MYSQL索引

索引的作用 索引类似书籍目录,查找数据,先查找目录,定位页码 性能影响 索引能大大减少查询数据时需要扫描的数据量,提高查询速度, 避免排序和使用临时表 将随机I/O变顺序I/O 降低写速度,占用磁...

关元
19分钟前
0
0
撬动世界的支点——《引爆点》读书笔记2900字优秀范文

撬动世界的支点——《引爆点》读书笔记2900字优秀范文: 作者:挽弓如月。因为加入火种协会的读书活动,最近我连续阅读了两本论述流行的大作,格拉德威尔的《引爆点》和乔纳伯杰的《疯传》。...

原创小博客
30分钟前
4
0
《配电网自动化技术》第一章

写了配电网的组成、历程、难点、存在问题、解决方案,还是蛮好的。尤其是各地建设的系统后续又无法实用化,以及多种终端反而增加了运维工作量等,都是目前切实存在的让大家不停吐槽的内容。

max佩恩
35分钟前
1
0

中国龙-扬科
53分钟前
6
0
使用vuex的state状态对象的5种方式

vuex是一个专门为vue.js设计的状态管理模式,并且也可以使用devtools进行调试。 下面给大家来贴一下我的vuex的结构 下面是store文件夹下的state.js和index.js内容 //state.jsconst state =...

peakedness丶
57分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部