經驗教訓:excel大量數據導入Mysql的血淚史


先后遇到的問題:

  1.插入速度太慢

  2.Excel的數據太臟,同一列中混合有許多不同類型的值(日期,整數,浮點數)

  3.字符集導致的字段太長問題(Data too long for column Data too long for column) [整了我一天,那一天就算我睡了個飽心情美汁汁,一看到這個問題還是會讓我眉頭緊皺]

  4.Table is full,小破阿里雲服務器沒空間了

解決過程:

  1.插入速度太慢:

    如果是一條條的簡單插入,兩分鍾才插入1k+條,實在是太慢了。於是上網查了一些方法。

    1.改用 PreparedStatement來批插入, 也就是 用 insert into table (a,b,c,d,e,......) values( ?, ? , ? ,......) 的方法去插入

    每用 setObject 設置完一個 括號 : () 里的值就 addBatch, 最后 executeBatch , 但實際上還是很慢,和之前沒什么區別,或許是我用的方法有問題,具體為什么還要去研究下Mysql的實現

      2.改用另一種批插入方法:多值插入

    也就是把 sql 語句寫成 insert into table (a,b,c,d,e,......) values (x,y,z,...), (x1,y1,z1,...), (..,..,..,...), (..,..,..,...), (..,..,..,...), (..,..,..,...)......

    用的不是PreparedStatement ,而是普通 statement 的 execute,有明顯的效果,原本要十幾分鍾來插入的 8m的excel,只用十幾秒就可以插入到數據庫

  2.編碼問題    

    但是隨之而來發生的是 Data too long for column Data too long for column 的錯誤,困擾了我許久,我的列明明長度管夠,為什么還報錯?

    按照網上的方法試了許久,還是不行,於是在想是不是和 PreparedStatement 和 Statement 的區別。

    最后改用 PreparedStatement , 還是用多值插入 insert into table (a,b,c,d,e,......) values (?,?,?,...), (?,?,?,...), (?,?,?,...), (?,?,?,...), (?,?,?,...), (?,?,?,...)......

    實現起來比較復雜,但是試了許久還是有問題,於是把數據庫表中 對應列的 編碼改成 utf8,並且適當增長長度,最后成功,具體為什么可能要日后查看實現才能知道

    后來又用舊的代碼,也就是之前普通statement的語句測試了一下,數據插入成功,可以斷定是列的編碼不正確,應該選用 utf8

  3.數據太臟

    知道表的格式,把表頭及其對應的類型(按照表頭的下一行判斷,可能表頭的下一列是空的,或者下一列本身不正確,不正確概率比較小,我業務的臟數據一般出現在中后部分),讀取出來,建立 表明 - 列類型集合  的映射,如果讀進來的值不符合類型,則直接跳過該行,問題解決

    

      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM