插入大量資料速度慢的解決方法:批量插入
場景:
專案需要匯入案件2200條。其中匯入的excel每個行案件的資訊上包含大約15個聯絡方式。那麼總的聯絡方式一共用30000條左右
這裡優化之前的速度是16-20分鐘之間。太慢了。找了好久優化的方法。最後確定了使用mysql批量插入的方法去進行插入操作
慢的原因及解決思路:
這裡慢的原因是針對本專案:
插入方式為程式遍歷迴圈逐條插入。在mysql上檢測插入一條的速度在0.02s到0.04s之間。
所以逐條插入的速度是0.03*30000條的速度是15分鐘左右。
所以逐條插入是沒法優化的。然後去查詢優化方式。發現用批量插入的方法可以提高很大速度。
將30000條資料的插入速度提升到1-2分鐘左右
這裡放一個測試demo例子:
用junit測試迴圈插入1000條資料的時間與用批量插入插入10000條使用的時間
1普通迴圈插入1000條資料的時間測試
@Test
public void insertCuiji() {
List<Cuiji> list= new ArrayList<Cuiji>();
Cuiji cuiji = new Cuiji();
cuiji.setBankcode("jylh");
cuiji.setCompanycode("qixin");
for (int i = 0; i < 1000; i++) {
cuijiMapper.insertSelectiveO(cuiji, "jylh");
}
}
執行速度是38s也就是0.038*1000的速度。比較慢了
2用批量插入插入10000條使用的時間
@Test
public void insertCuiji() {
List<Cuiji> list= new ArrayList<Cuiji>();
for (int i = 0; i < 1000; i++) {
Cuiji cuiji = new Cuiji();
cuiji.setBankcode("jylh");
cuiji.setCompanycode("qixin");
list.add(cuiji);
}
cuijiMapper.insertListCuiji(list);
}
批量插入使用了0.0356s 這相當於插入一條資料的速度,所以用批量插入會大大提升資料插入速度,當有較大資料插入操作是用批量插入優化
批量插入的寫法:
dao定義層方法
Integer insertListCuiji(List<Cuiji> cuiji);
mybatis 的sql寫法
<insert id="insertListCuiji" parameterType="java.util.List">
INSERT INTO `case`.`t_cuiji`
( `doccode`,
`companycode`,
`bankcode`,
`notes`,
`type`)
values
<foreach collection="list" item="item" separator="," index="index">
(#{item.doccode},
#{item.companycode},
#{item.bankcode},
#{item.notes},
#{item.type})
</foreach>
</insert>
這樣就能進行批量插入操作:
注:當批量運算元據量大的時候。例如我插入3w條資料要操作的資料包超過了1M會報 Mysql You can change this value on the server by setting the max_allowed_packet' variable. 異常 此時修改mysql的max_allowed_packet大小即可,詳細解決方法請看:
http://blog.csdn.net/alice_qixin/article/details/78522600
或者將list分成幾份去插入。
謝謝觀看!
相關文章
- 使用Mybatis批量插入大量資料的實踐MyBatis
- mybatis插入資料、批量插入資料MyBatis
- 迅速插入大量測試資料的方法
- Oracle 插入大量資料Oracle
- 往表中插入大量資料的方法(一)
- oracle批量插入資料Oracle
- MyBatis 批量插入資料MyBatis
- 往表中插入大量的資料的方法(二)
- 後端開發:【批量插入海量資料之Java插入MySql】解決方案後端JavaMySql
- MySQL:JDBC批量插入資料的效率MySqlJDBC
- 使用MySqlBulkLoader批量插入資料MySql
- 大表資料插入批量提交
- 海量資料處理_批量插入
- SQL語句批量插入資料SQL
- SqlBulkCopy 複製批量插入資料SQL
- 如何向mysql中批量插入大量sql語句MySql
- 批量插入資料的儲存過程儲存過程
- MyBatis Plus 批量資料插入功能,yyds!MyBatis
- MySQL大量資料插入各種方法效能分析與比較MySql
- MongoDB批量插入大資料文件的簡單方法一例MongoDB大資料
- Oracle批量插入資料insert all into用法Oracle
- 使用 【Ado.Net】 批量插入資料
- Redis從檔案中批量插入資料Redis
- MSSQL資料批量插入優化詳細SQL優化
- 向表中插入大批量資料
- Oracle插入Blob資料的方法Oracle
- 資料庫批量插入這麼講究的麼?資料庫
- 解決hive資料庫 插入資料很慢的問題Hive資料庫
- Laravel 批量插入(如果資料存在刪除原資料)Laravel
- ibatis對oracle資料庫的批量更新和批量插入的操作BATOracle資料庫
- 使用SqlBulkCopy批量插入或遷移資料(轉)SQL
- Android 資料庫 大量插入 事務開啟Android資料庫
- SQL Server大量插入 JavaSQLServerJava
- MySQL插入資料1366錯誤解決方案MySql
- 批量插入資料時主鍵衝突的處理
- laravel實現100w大量資料插入資料庫Laravel資料庫
- 解決Mysql資料庫插入資料出現問號(?)的解決辦法MySql資料庫
- MyBatis中批量插入資料,多重forEach迴圈MyBatis