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

插入数据居然需要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秒,非常快。

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

  1. MySQL mysql性能调优

    MySQL性能调优,SQL优化.索引优化 慢查询日志 当查询超过一定的时间没有返回结果的时候,才会记录到慢查询日志中.默认不开启. 采样的时候手工开启.可以帮助我们找出执行慢的 SQL 语句 查看慢 ...

  2. MySQL性能调优与架构设计——第4章 MySQL安全管理

    第4章 MySQL安全管理 前言 对于任何一个企业来说,其数据库系统中所保存数据的安全性无疑是非常重要的,尤其是公司的有些商业数据,可能数据就是公司的根本,失去了数据的安全性,可能就是失去了公司的一切 ...

  3. MySQL性能调优与架构设计——第5章 备份与恢复

    第5章 备份与恢复 前言 数据库的备份与恢复一直都是 DBA 工作中最为重要的部分之一,也是基本工作之一.任何正式环境的数据库都必须有完整的备份计划和恢复测试,本章内容将主要介绍 MySQL数据库的备 ...

  4. MySQL 性能调优之存储引擎

    原文:http://bbs.landingbj.com/t-0-246222-1.html        http://bbs.landingbj.com/t-0-245851-1.html MySQ ...

  5. MySQL性能调优与架构设计——第11章 常用存储引擎优化

    第11章 常用存储引擎优化 前言: MySQL 提供的非常丰富的存储引擎种类供大家选择,有多种选择固然是好事,但是需要我们理解掌握的知识也会增加很多.每一种存储引擎都有各自的特长,也都存在一定的短处. ...

  6. 经典!《MySQL性能调优手册》高清电子版,限时 3 天免费下载

    点击上方"逆锋起笔",关注领取视频教程 ☞ 程序员进阶必备资源免费送「各种技术!」 ☜ 作为最流行的开源数据库软件之一,MySQL数据库软件已经是广为人知的了,性能调优是MySQL ...

  7. mysql 读写分离缺点6_6\MySQL 主从同步 , MySQL 读写分离 , MySQL 性能调优

    6\MySQL 主从同步 , MySQL 读写分离 , MySQL 性能调优 day06 一,mysql 主从同步 二,数据读写分离 三,MySQL 优化 ++++++++++++++++++++++ ...

  8. 转】MYSQL性能调优与架构设计之select count(*)的思考

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/5/ 感谢! Posted: Feb 7, 2013 Tag ...

  9. MySQL 性能调优和优化技巧

    介绍 MySQL 是一种流行的开源数据库应用程序,它以一种有意义且易于访问的方式存储和构造数据.对于大型应用程序,庞大的数据量可能会导致性能问题. 本指南提供了一些关于如何提高 MySQL 数据库性能 ...

最新文章

  1. Spring Boot 2.4版本前后的分组配置变化及对多环境配置结构的影响
  2. 爬虫入门三(获取各国网址,三种网页抓取方法,下载缓存)
  3. 【干货】数字经济时代的新思考:企业如何进行数字化转型及如何称为数据驱动型企业?...
  4. lamp怎么使用mysql_lamp(四)mysql操作
  5. 我有机器人合体成一个大力神_变形金刚动漫人物:狂派霸天虎挖地虎合体金刚-大力神...
  6. 学python之路前的一些话
  7. 采用C语言写文本文件实例
  8. 没有提取码 php云盘文件,最新百度网盘分享文件链接无需提取码的方法
  9. 2017年苹果开发者账号申请——账号VISA卡支付流程
  10. 批量删除QQ空间说说和日志的js脚本
  11. 六十星系之54廉贞破军坐卯酉
  12. 欢迎大家来到第二期【产品家·实战营】
  13. 如何理解GWAS中Manhattan plot和QQ plot所传递的信息
  14. 使用DOM4J解析XML文件的两种方法
  15. 微信聊天,对方回复“哦”怎么办?学会这3个技巧,永不尬聊
  16. 如何添加旺旺客户,淘宝店铺左侧代码
  17. 第四章 Cesium学习入门之加载离线影像图(tif)
  18. 共创软硬件协同生态:Graphcore IPU与百度飞桨的“联合提交”亮相MLPerf
  19. sip测试工具--Sipp的编译
  20. numpy 向量/矩阵的乘法

热门文章

  1. bootsrap+jquery+组件项目引入文件的常见报错
  2. JAVA线程池ScheduledExecutorService周期性地执行任务 与单个Thread周期性执行任务的异常处理...
  3. Wijmo 更优美的jQuery UI部件集:爱上 ThemeRoller
  4. assign和always的使用
  5. WIN7 UAC/结构体的Equals方法/C# 开发wince程序,窗口上总留有一块空白区域/静态构造函数...
  6. 读excel图片到数据库和上传图片到数据库
  7. IT服务管理(ITSM):IT行业变革的思考(4)
  8. 中山计算机编程,中山plc编程设计
  9. Windows PE 重定位表编程(枚举重定位地址)
  10. 【错误记录】记录 Android 命令行执行 Java 程序中出现的错误 ( dx 打包 PC 可执行文件报错 | dalvik 命令执行 kotlin 编译的 dex 文件报错 )