大數據量插入數據庫

大數據量下,提高插入速度的方法。

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配置文件定義方法
begin insert into P_ME_SEND_TO_PHONE (PHONEID, PHONE, OPENID, EXTEND_1,EXTEND_2, EXTEND_3) values( SEQ_P_ME_SEND_TO_PHONE.nextval, #{item.phone,jdbcType=VARCHAR}, #{item.openid,jdbcType=VARCHAR}, #{item.extend1,jdbcType=VARCHAR}, #{item.extend2,jdbcType=VARCHAR}, #{item.extend3,jdbcType=VARCHAR} ); end;

表優化方面:
如何優化MySQL千萬級表

參考:
MySQL批量千萬級數據SQL插入性能優化<細讀>
MySql 快速插入千萬級大數據的方法示例
大量List數據批量插入數據庫很高效的方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章