1. 程式人生 > >MySQL實現批量插入以優化效能的教程

MySQL實現批量插入以優化效能的教程

對於一些資料量較大的系統,資料庫面臨的問題除了查詢效率低下,還有就是資料入庫時間長。特別像報表系統,每天花費在資料匯入上的時間可能會長達幾個小時或十幾個小時之久。因此,優化資料庫插入效能是很有意義的。
經過對MySQL innodb的一些效能測試,發現一些可以提高insert效率的方法,供大家參考參考。

1. 一條SQL語句插入多條資料。
常用的插入語句如:
 

?
1 2 3 4 INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)
VALUES ('0', 'userid_0', 'content_0', 0); INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('1', 'userid_1', 'content_1', 1);

修改成:
 

?
1 2 INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)
VALUES ('0', 'userid_0', 'content_0', 0), ('1', 'userid_1', 'content_1', 1);

修改後的插入操作能夠提高程式的插入效率。這裡第二種SQL執行效率高的主要原因是合併後日志量(MySQL的binlog和innodb的事務讓日誌)減少了,降低日誌刷盤的資料量和頻率,從而提高效率。通過合併SQL語句,同時也能減少SQL語句解析的次數,減少網路傳輸的IO。
這裡提供一些測試對比資料,分別是進行單條資料的匯入與轉化成一條SQL語句進行匯入,分別測試1百、1千、1萬條資料記錄。

2015411105302028.jpg (295×109)

2. 在事務中進行插入處理。
把插入修改成:
 

?
1 2 3 4 5 6 7 START TRANSACTION; INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0',
MYSQL避免批量插入重複資料報錯的解決方案

        在mysql中,想要批量的插入資料到資料庫,會使用這樣的語句        INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date'), ('Anothe

Oracle,sql server,mysql批量插入

在使用mybatis進行批量插入時,發現對於使用Oracle的自動增長序列時提示 : ORA-02287: 此處不允許序號 的錯誤,下面的這種使用可以解決問題: <!-- oracle批量插入 -->    <insert id="inserts" para

MySQL資料庫批量插入(Spring Boot+Mybatis)

1 專案需求 從excel中讀取幾萬條記錄,儲存到MySQL資料庫中。因為記憶體中記錄幾萬條,如果直接遍歷所有記錄,迴圈插入資料庫,耗時太長,所以計劃優化插入速度。 目前可供選擇的解決方案如下: mybatis的官方寫法 利用mysql特性,拼寫inse

spring JDBCTemplate實現批量插入及返回id

1、插入一條記錄返回剛插入記錄的id public int addBean(final Bean b){ final String strSql = "insert into buy(id,c,s,remark,line,cdatet

【】mysql結算批量處理的優化

mysql是使用的比較多的關係型資料庫了 但是在操作量大的會存在明顯的效能退化, 之前在處理競猜結算的時候遇到了的這個問題,對應的優化解決方案: 儘量使用批量的查詢,修改,插入來替換單條操作 select gold from t where uid in (aa,bb,cc

電商專案之mybatis實現批量插入

<insert id="batchInsert" parameterType="list" > insert into mmall_order_item (id, user_id, order_no, product_id, product_name, produ