大數據量下,提高插入速度的方法。
1、Java代碼方面,使用多線程插入,並且使用批處理提交。
2、數據庫方面,表結構建立時不要使用索引,要不然插入過程過還要維護索引B+樹;修改存儲引擎,一般默認是InnoDB.
3、合併數據+事務的方法在較小數據量時,性能提高是很明顯的,數據量較大時(1千萬以上),性能會急劇下降,這是由於此時數據量超過了innodb_buffer的容量,每次定位索引涉及較多的磁盤讀寫操作,性能下降較快。而使用合併數據+事務+有序數據的方式在數據量達到千萬級以上表現依舊是良好,在數據量較大時,有序數據索引定位較爲方便,不需要頻繁對磁盤進行讀寫操作,所以可以維持較高的性能。
注意事項:
1、SQL語句是有長度限制,在進行數據合併在同一SQL中務必不能超過SQL長度限制,通過max_allowed_packet配置可以修改,默認是1M,測試時修改爲8M。
2、事務需要控制大小,事務太大可能會影響執行的效率。MySQL有innodb_log_buffer_size配置項,超過這個值會把innodb的數據刷到磁盤中,這時,效率會有所下降。所以比較好的做法是,在數據達到這個這個值前進行事務提交。
###下面方法適用於大量(百萬級別的List數據),插入到Oracle表中
private static final int OPENID_PHONE_NUM = 800; //經實踐,800一批插入相對較快,這個可以隨便定義
private void insertPMeSendToPhoneInfo(List phoneList){
int listSize=phoneList.size();
int toIndex=OPENID_PHONE_NUM;
for(int i = 0;i<phoneList.size();i+=OPENID_PHONE_NUM){
if(i+OPENID_PHONE_NUM>listSize){//作用爲toIndex最後沒有800條數據則剩餘幾條newList中就裝幾條
toIndex=listSize-i;
}
List<PMeSendToPhone> newPMeSendToPhoneInfo = phoneList.subList(i,i+toIndex);
//批量插入
pMeSendToPhoneMapper.batchInsertPMePhoneData(newPMeSendToPhoneInfo);
}
}
/** 接口方法定義
*批量插入
- @param newPMeSendToPhoneInfo
- @return
*/
int batchInsertPMePhoneData(@Param(value = “list”) List newPMeSendToPhoneInfo);
mybits配置文件定義方法
表優化方面:
如何優化MySQL千萬級表
參考:
MySQL批量千萬級數據SQL插入性能優化<細讀>
MySql 快速插入千萬級大數據的方法示例
大量List數據批量插入數據庫很高效的方法