1. 程式人生 > >Java mysql 實現JDBC百萬級數據插入

Java mysql 實現JDBC百萬級數據插入

需要 ransac 情況 必須 nod table 導入 cut space

因為公司項目需要做一個excle快速導入到mysql功能,之前已經解決Java讀取excle文件,但是因為文件有100w+的數據,插入mysql數據庫很慢,1小時10w條,必須要做優化,後面寫了批量插入1000條y一個批,但是速度還是很慢,查看數據庫後發現mysql數據寫入很慢,所以就對mysql數據做了寫入優化,主要參考https://blog.csdn.net/qq_31065001/article/details/71519197

對一般情況下mysql上百萬數據讀取和插入更新是沒什麽問題了,但到了上千萬級就會出現很慢,下面我們來看mysql千萬級數據庫插入速度和讀取速度的調整記錄吧。

(1)提高數據庫插入性能中心思想:盡量將數據一次性寫入到Data File和減少數據庫的checkpoint 操作。這次修改了下面四個配置項:
1)將 innodb_flush_log_at_trx_commit 配置設定為0;按過往經驗設定為0,插入速度會有很大提高。

0: Write the log buffer to the log file and flush the log file every second, but do nothing at transaction commit.
1:the log buffer is written out to the log file at each transaction commit and the flush to disk operation is performed on the log file
2:the log buffer is written out to the file at each commit, but the flush to disk operation is not performed on it
2)將 innodb_autoextend_increment 配置由於默認8M 調整到 128M

此配置項作用主要是當tablespace 空間已經滿了後,需要MySQL系統需要自動擴展多少空間,每次tablespace 擴展都會讓各個SQL 處於等待狀態。增加自動擴展Size可以減少tablespace自動擴展次數。

3)將 innodb_log_buffer_size 配置由於默認1M 調整到 16M

此配置項作用設定innodb 數據庫引擎寫日誌緩存區;將此緩存段增大可以減少數據庫寫數據文件次數。

4)將 innodb_log_file_size 配置由於默認 8M 調整到 128M

此配置項作用設定innodb 數據庫引擎UNDO日誌的大小;從而減少數據庫checkpoint操作。

經過以上調整,系統插入速度由於原來10分鐘幾萬條提升至1秒1W左右;註:以上參數調整,需要根據不同機器來進行實際調整。特別是 innodb_flush_log_at_trx_commit、innodb_log_buffer_size和 innodb_log_file_size 需要謹慎調整;因為涉及MySQL本身的容災處理。

修改完之後發現插入速度又提升但是並沒有達到帖子裏說的10000/秒,看了下數據庫數據 10000條數據確實是同時插入的,就打印了一下代碼的執行時間,發現

pstm.executeBatch();
時間主要消耗在這裏,然後根據https://blog.csdn.net/lgh1117/article/details/80212924這篇帖子對mysql連接串加上rewriteBatchedStatements=true參數,執行代碼 插入51w數據只需要52s;OK;

Java mysql 實現JDBC百萬級數據插入