mysql 批量插入 Mysql批量插入分析

2021-10-25 14:18:42 字數 2387 閱讀 5025

前言最近發現幾個專案中都有批次插入資料庫的功能,每個專案中批次插入的寫法有一些差別,所以本文打算對mysql的批次插入做乙個詳細的分析。

準備1.jdk1.7,mysql5.6.38

2.準備庫和表

測試與分析

下面準備幾種插入的方式來分析優劣:

1.statement插入方式

準備資料,然後通過statement方式插入資料,插入10000條資料大概在6秒多左右,同時可以監控伺服器資料報;

監控命令:

日誌如下:

以上擷取了其中一條插入語句的資料報日誌,詳細的資料報可以通過如下命令監控:

詳細日誌:

可以發現每個sql語句包前面都有乙個select.@@session.tx_read_only包,這是因為mysql jdbc驅動設定uselocalsessionstate=false,每一次都需要檢測目標資料庫isreadonly的狀態,

所以每次都傳送select.@@session.tx_read_only包,可以設定uselocalsessionstate=true使用連線物件本地的狀態,可以修改url如下:

再次執行,觀察日誌:

2.preparedstatement方式

preparedstatement比起statement有很多優勢,其中一條就是preparedstatement比statement更快,sql語句會預編譯在資料庫系統中,執行計畫同樣會被快取起來,它允許資料庫做引數化查詢。同樣插入10000條資料,時間大概在5秒多左右,比起statement有一定優勢,但是不明顯;preparedstatement使用的是批次提交,速度不應該這麼查,同樣觀察日誌:

發現和statement沒有區別,一條語句對應了乙個包,沒有批次的效果,檢視preparedstatement的executebatch方法,部分**如下:

其中大致邏輯就是如果canrewriteasmultivalueinsertatsqllevel()為true,那麼執行批次插入(executebatchedinserts),否則執行串聯插入(executebatchserially);具體可以通過url上新增引數rewritebatchedstatements:

再次執行,插入10000條資料只需要100ms左右,觀察日誌:

可以發現資料報不是原來的92個位元組了,每個包的大小大幅度提公升,具體分多少次提交,每次提交多少資料量,可以檢視preparedstatement的computebatchsize方法:

此方法計算每次提交批量資料中的多少條資料,其中乙個maxallowedpacket引數,此引數在伺服器端配置用來限制客戶端每個包的最大位元組數;

查詢maxallowedpacket:

設定maxallowedpacket:

此方式可以很好的執行批量資料的插入,但是如果資料量很大,一下執行所有資料的批次插入,很容易造成客戶端記憶體的溢位,所以也可以使用第三種方式;

3.preparedstatement分批次方式

部分**如下:

同樣是插入10000條資料,但是這種方式是,分10次批次插入資料,有效的控制了記憶體的消耗,可以做乙個簡單的實驗;

設定啟動引數

然後分別使用第二種方式和第三種方式插入10w條資料,第二種方式直接記憶體溢位,而第三種方式可以完整的將資料插入;當然分批次插入肯定比一次性插入速度慢,所以可以在記憶體和速度方面做乙個簡單的權衡。

總結

mysql批模式 MySQL 批量模式

peter 什麼是批量模式 從檔案中讀取標準sql 命令 通過互動模式進行詢問 為什麼需要使用批量模式 重複進行相同詢問 可以通過管道,詳細查詢返回結果 可以把查詢結果輸出到檔案中 可以很方便把指令碼分配給其他使用者 cron job 以批量模式建立表單 mysql create table my ...

mysql批量插入

mybatis foreach 批量批量插 foreach 於迴圈拼接的內建標籤,常 於 批量新增 in查詢等常 包含以下屬性 collection 必填,值為要迭代迴圈的集合型別,情況有多種 參是list 型別的時候,collection 屬性值為 list 參是map 型別的時候,collect...

mysql插入資料寫法 mysql 批量插入資料

mysql使用insert插入多條記錄,應該如何操作呢?下面就為您詳細介紹mysql使用insert插入多條記錄的實現方法,供您參考。看到這個標題也許大家會問,這有什麼好說的,呼叫多次insert語句不就可以插入多條記錄了嗎!但使用這種方法要增加伺服器的負荷,因為,執行每一次sql伺服器都要同樣對s...