MySQL如何快速匯入資料
前言:
日常學習和工作中,經常會遇到導資料的需求。比如資料遷移、資料恢復、新建從庫等,這些操作可能都會涉及大量資料的匯入。有時候匯入進度慢,電腦風扇狂轉真的很讓人崩潰,其實有些小技巧是可以讓匯入更快速的,本篇文章筆者會談一談如何快速的匯入資料。
注:本篇文章只討論如何快速匯入由邏輯備份產生的SQL指令碼,其他檔案形式暫不討論。
1.儘量減小匯入檔案大小
首先給個建議,匯出匯入資料儘量使用MySQL自帶的命令列工具,不要使用Navicat、workbench等圖形化工具。特別是大資料量的時候,用MySQL自帶的命令列工具匯出和匯入比用Navicat等圖形化工具要快數倍,而且用Navicat等圖形化工具做大資料量的操作時很容易卡死。下面簡單介紹下怎麼用MySQL自帶的命令列工具做匯入匯出。
# 匯出整個例項 mysqldump -uroot -pxxxxxx --all-databases > all_database.sql # 匯出指定庫 mysqldump -uroot -pxxxxxx --databases testdb > testdb.sql # 匯出指定表 mysqldump -uroot -pxxxxxx testdb test_tb > test_tb.sql # 匯入指定SQL檔案 (指定匯入testdb庫中) mysql -uroot -pxxxxxx testdb < testdb.sql
匯入的SQL指令碼內容大多是先建庫建表,然後插入資料,其中耗時最長的應該是insert插入資料了。為了減小檔案大小,推薦使用擴充套件插入方法,即多行一起批量insert,類似這樣:insert into table_name values (),(),...,(); 。使用擴充套件插入比一條條插入,檔案大小要小很多,插入速度要快好幾倍。使用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,log buffer將每秒一次地寫入log file中,並且log file的flush(刷到磁碟)操作同時進行.該模式下,在事務提交的時候,不會主動觸發寫入磁碟的操作。
如果innodb_flush_log_at_trx_commit設定為1,每次事務提交時MySQL都會把log buffer的資料寫入log file,並且flush(刷到磁碟)中去.
如果innodb_flush_log_at_trx_commit設定為2,每次事務提交時MySQL都會把log buffer的資料寫入log file.但是flush(刷到磁碟)操作並不會同時進行。該模式下,MySQL會每秒執行一次 flush(刷到磁碟)操作。sync_binlog預設值為1,可設定為[0,N)
當sync_binlog =0,像作業系統刷其他檔案的機制一樣,MySQL不會同步到磁碟中去而是依賴作業系統來重新整理binary log。
當sync_binlog =N (N>0) ,MySQL 在每寫 N次 二進位制日誌binary log時,會使用fdatasync()函式將它的寫二進位制日誌binary log同步到磁碟中去。
這兩個引數可以線上修改,若想快速匯入,可以按照下面步驟來操作:
# 1.進入MySQL命令列 臨時修改這兩個引數 set global innodb_flush_log_at_trx_commit = 2; set global sync_binlog = 2000; # 2.執行SQL指令碼匯入 mysql -uroot -pxxxxxx testdb < testdb.sql # 3.匯入完成 再把引數改回來 set global innodb_flush_log_at_trx_commit = 1; set global sync_binlog = 1;
還有另外一種場景是你的需求是新建從庫,或者是不需要產生binlog,這時候匯入SQL指令碼時可以設定暫時不記錄binlog,可以在指令碼開頭增加 set sql_log_bin=0; 然後再執行匯入,這樣速度會進一步加快。如果你的MySQL例項沒有開啟binlog則不需要再執行該語句了。
總結:
本篇文章主要介紹快速匯入資料的方法,可能還有其他方法快速匯入資料,比如load data或者寫程式多執行緒插入。本文中介紹的方法只適合手動匯入SQL指令碼,下面總結下本文中提到的方法。
- 使用MySQL自帶的命令列工具進行匯出匯入。
- 使用擴充套件插入方法,一個insert對於多個值。
- 臨時修改innodb_flush_log_at_trx_commit和sync_binlog引數。
- 關閉binlog或者臨時不記錄binlog。
其實還有一些其他方案,比如先不建立索引,插入資料後再執行新增索引操作;或者先將表改為MyISAM或MEMORY引擎,匯入完成後再改為InnoDB引擎。不過這兩種方法實施起來較為麻煩且不知效果如何。以上方法只是筆者依據個人經驗總結得出,可能不太全面,歡迎各位補充哦。
以上就是MySQL如何快速匯入資料的詳細內容,更多關於MySQL匯入資料的資料請關注我們其它相關文章!