Mysql使用PreparedStatement的批量插入優化

背景

  • 上W級別的單表數據,要實現快速插入

使用executeBatch 優化

  • 原實現
    PreparedStatement cmd = connection
                 .prepareStatement("insert into test values(?,?)");
     for (int i = 0; i < 10000; i++) {
             cmd.setInt(1, i);
             cmd.setString(2, "test");
             cmd.executeUpdate();
         }
  • 使用executeBatch
 PreparedStatement cmd = connection
                 .prepareStatement("insert into test values(?,?)");
for (int i = 0; i < 10000; i++) {//1萬條數據
             cmd.setInt(1, i);
             cmd.setString(2, "test");
             cmd.addBatch();
             }
   cmd.executeBatch();
  • 性能比較:executeBatch 與executeUpdate相比會有5倍左右的性能提升,但是比較 尷尬的是這裏出問題的 是C++代碼,Mysql提供的Mysql Connector組件Java是支持executeBatch ,但是C++的Connector組件是不支持的,如果想實現批量插入,需要自己進行拼接收SQL語句。

關閉自動提交再優化

  • MySQL是默認開啓自動提交的,這就表示除非顯式地開始一個事務,否則每個查詢都被當做一個單獨的事務自動執行。
    在這裏插入圖片描述
  • Mysql的InnoDB存儲引擎支持事務處理。InnoDB表引擎下關閉mysql自動事務提交可以大大提高數據插入的效率,這是因爲如果需要插入1000條數據,mysql會自動發起(提交)1000次的數據寫入請求,如果把autocommit關閉掉,通過程序來控制,只要一次commit就可以搞定,這是會大大提高速率
    在這裏插入圖片描述
  • C++側關閉自動提交之後的性能對比,從日誌可以看出,比之前性能提升了將近三倍
//關閉自動提交
connection->setAutoCommit(false);
//進行手動提交 
connection_->commit(); 

在這裏插入圖片描述

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