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秒,很是快。

相關文章
相關標籤/搜索