日常學習和工作中,經常會遇到導數據的需求。比如數據遷移、數據恢復、新建從庫等,這些操作可能都會涉及大量數據的導入。有時候導入進度慢,電腦風扇狂轉真的很讓人崩潰,其實有些小技巧是可以讓導入更快速的。下面學步園小編來講解下MySQL如何快速插入數據?
MySQL如何快速插入數據
1.盡量減小導入文件大小
首先給個建議,導出導入數據盡量使用MySQL自帶的命令行工具,不要使用Navicat、workbench等圖形化工具。特別是大數據量的時候,用MySQL自帶的命令行工具導出和導入比用Navicat等圖形化工具要快數倍,而且用Navicat等圖形化工具做大數據量的操作時很容易卡死。下面簡單介紹下怎麼用MySQL自帶的命令行工具做導入導出。
#導出整個實例
mysqldump-uroot-pxxxxxx--all-databases>all_database.sql
#導出指定庫
mysqldump-uroot-pxxxxxx--databasestestdb>testdb.sql
#導出指定表
mysqldump-uroot-pxxxxxxtestdbtest_tb>test_tb.sql
#導入指定SQL文件(指定導入testdb庫中)
mysql-uroot-pxxxxxxtestdb
導入的SQL腳本內容大多是先建庫建表,然後插入數據,其中耗時最長的應該是insert插入數據了。為了減小文件大小,推薦使用擴展插入方法,即多行一起批量insert,類似這樣:insertintotable_namevalues(),(),(),...,();。使用擴展插入比一條條插入,文件大小要小很多,插入速度要快好幾倍。使用mysqldump導出的文件默認是使用批量插入的方法,導出時可使用--skip-extended-insert參數改為逐條插入。
可以看出,使用擴展插入的SQL腳本導入大概需要10分鐘左右,而一條條插入的SQL腳本導入時間過長,大概1個小時仍然沒有導完,一個2個多G的文本導入一個多小時仍未結束,等不及的筆者就手動取消了不過還是可以看出多條一起insert比一條條插入數據要節省數倍的時間。
2.嘗試修改參數加快導入速度
在MySQL中,有一對大名鼎鼎的「雙一」參數,即innodb_flush_log_at_trx_commit與sync_binlog。為了安全性這兩個參數默認值為1,為了快速導入腳本,我們可以臨時修改下這兩個參數,下面簡單介紹下這兩個參數:
innodb_flush_log_at_trx_commit默認值為1,可設置為0、1、2
如果innodb_flush_log_at_trx_commit設置為0,logbuffer將每秒一次地寫入logfile中,並且logfile的flush(刷到磁碟)操作同時進行.該模式下,在事務提交的時候,不會主動觸發寫入磁碟的操作。如果innodb_flush_log_at_trx_commit設置為1,每次事務提交時MySQL都會把logbuffer的數據寫入logfile,並且flush(刷到磁碟)中去.如果innodb_flush_log_at_trx_commit設置為2,每次事務提交時MySQL都會把logbuffer的數據寫入logfile.但是flush(刷到磁碟)操作並不會同時進行。該模式下,MySQL會每秒執行一次flush(刷到磁碟)操作。
sync_binlog默認值為1,可設置為[0,N)
當sync_binlog=0,像操作系統刷其他文件的機制一樣,MySQL不會同步到磁碟中去而是依賴操作系統來刷新binarylog。當sync_binlog=N(N>0),MySQL在每寫N次二進位日誌binarylog時,會使用fdatasync()函數將它的寫二進位日誌binarylog同步到磁碟中去。
MySQL如何快速插入數據
這兩個參數可以在線修改,若想快速導入,可以按照下面步驟來操作:
#1.進入MySQL命令行臨時修改這兩個參數
setglobalinnodb_flush_log_at_trx_commit=2;
setglobalsync_binlog=2000;
#2.執行SQL腳本導入
mysql-uroot-pxxxxxxtestdb
#3.導入完成再把參數改回來
setglobalinnodb_flush_log_at_trx_commit=1;
setglobalsync_binlog=1;
還有另外一種場景是你的需求是新建從庫,或者是不需要產生binlog,這時候導入SQL腳本時可以設置暫時不記錄binlog,可以在腳本開頭增加setsql_log_bin=0;然後再執行導入,這樣速度會進一步加快。如果你的MySQL實例沒有開啟binlog則不需要再執行該語句了。
總結:
本篇文章主要介紹快速導入數據的方法,可能還有其他方法快速導入數據,比如loaddata或者寫程序多線程插入。本文中介紹的方法只適合手動導入SQL腳本,下面總結下本文中提到的方法。
使用MySQL自帶的命令行工具進行導出導入。
使用擴展插入方法,一個insert對於多個值。
臨時修改innodb_flush_log_at_trx_commit和sync_binlog參數。
關閉binlog或者臨時不記錄binlog。
其實還有一些其他方案,比如先不創建索引,插入數據後再執行添加索引操作;或者先將表改為MyISAM或MEMORY引擎,導入完成後再改為InnoDB引擎。不過這兩種方法實施起來較為麻煩且不知效果如何。以上方法只是筆者依據個人經驗總結得出,可能不太全面,歡迎各位補充哦。
以上就是關於「MySQL如何快速插入數據」的內容,希望對大家有用。更多資訊請關注學步園。學步園,您學習IT技術的優質平台!