日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發布時間:2025/6/17 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java连MySQL性能调优(batch insert和连续left join筛选) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

之前一個數據校驗功能遇到嚴重性能瓶頸

插入數據居然需要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筛选)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。