插入大量資料速度慢的解決方法:批量插入

Alice_qixin發表於2017-11-13

場景:

專案需要匯入案件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分成幾份去插入。


謝謝觀看!

相關文章