前言
對于一些資料量較大的系統,資料庫面臨的問題除了查詢效率低下,還有就是資料入庫時間長,特別像報表系統,每天花費在資料匯入上的時間可能會長達幾個小時或十幾個小時之久,因此,優化資料庫插入性能是很有意義的,
經過對MySQL innodb的一些性能測驗,發現一些可以提高insert效率的方法,供大家參考參考,
方法
1. 一條SQL陳述句插入多條資料,
常用的插入陳述句如:
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);
修改成:
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,
2. 在事務中進行插入處理,
把插入修改成:
START TRANSACTION;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);...COMMIT;
使用事務可以提高資料的插入效率,這是因為進行一個INSERT操作時,MySQL內部會建立一個事務,在事務內才進行真正插入處理操作,通過使用事務可以減少創建事務的消耗,所有插入都在執行后才進行提交操作,
結論
從測驗結果可以看到,合并資料+事務的方法在較小資料量時,性能提高是很明顯的,資料量較大時(1千萬以上),性能會急劇下降,這是由于此時資料量 超過了innodb_buffer的容量,每次定位索引涉及較多的磁盤讀寫操作,性能下降較快,
注意事項
1. SQL陳述句是有長度限制,在進行資料合并在同一SQL中務必不能超過SQL長度限制,通過max_allowed_packet配置可以修改,默認是1M,測驗時修改為8M,
2. 事務需要控制大小,事務太大可能會影響執行的效率,MySQL有innodb_log_buffer_size配置項,超過這個值會把innodb的資料刷到磁盤中,這時,效率會有所下降,所以比較好的做法是,在資料達到這個這個值前進行事務提交,
關注公眾號:UP技術控 獲取更多資訊
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/227344.html
標籤:MySQL
