背景
- 上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();