濮阳杆衣贸易有限公司

主頁 > 知識庫 > MySQL如何快速導(dǎo)入數(shù)據(jù)

MySQL如何快速導(dǎo)入數(shù)據(jù)

熱門標簽:石家莊400電話辦理公司 地圖標注客戶付款 申請400電話電話價格 許昌外呼增值業(yè)務(wù)線路 廣東400企業(yè)電話申請流程 宜賓全自動外呼系統(tǒng)廠家 臨沂做地圖標注 新鄉(xiāng)智能外呼系統(tǒng)好處 咸陽防封電銷卡

前言:

日常學(xué)習(xí)和工作中,經(jīng)常會遇到導(dǎo)數(shù)據(jù)的需求。比如數(shù)據(jù)遷移、數(shù)據(jù)恢復(fù)、新建從庫等,這些操作可能都會涉及大量數(shù)據(jù)的導(dǎo)入。有時候?qū)脒M度慢,電腦風(fēng)扇狂轉(zhuǎn)真的很讓人崩潰,其實有些小技巧是可以讓導(dǎo)入更快速的,本篇文章筆者會談一談如何快速的導(dǎo)入數(shù)據(jù)。

注:本篇文章只討論如何快速導(dǎo)入由邏輯備份產(chǎn)生的SQL腳本,其他文件形式暫不討論。

1.盡量減小導(dǎo)入文件大小

首先給個建議,導(dǎo)出導(dǎo)入數(shù)據(jù)盡量使用MySQL自帶的命令行工具,不要使用Navicat、workbench等圖形化工具。特別是大數(shù)據(jù)量的時候,用MySQL自帶的命令行工具導(dǎo)出和導(dǎo)入比用Navicat等圖形化工具要快數(shù)倍,而且用Navicat等圖形化工具做大數(shù)據(jù)量的操作時很容易卡死。下面簡單介紹下怎么用MySQL自帶的命令行工具做導(dǎo)入導(dǎo)出。

# 導(dǎo)出整個實例
mysqldump -uroot -pxxxxxx --all-databases > all_database.sql

# 導(dǎo)出指定庫
mysqldump -uroot -pxxxxxx --databases testdb > testdb.sql

# 導(dǎo)出指定表
mysqldump -uroot -pxxxxxx testdb test_tb > test_tb.sql

# 導(dǎo)入指定SQL文件 (指定導(dǎo)入testdb庫中)
mysql -uroot -pxxxxxx testdb  testdb.sql

導(dǎo)入的SQL腳本內(nèi)容大多是先建庫建表,然后插入數(shù)據(jù),其中耗時最長的應(yīng)該是insert插入數(shù)據(jù)了。為了減小文件大小,推薦使用擴展插入方法,即多行一起批量insert,類似這樣:insert into table_name values (),(),(),...,(); 。使用擴展插入比一條條插入,文件大小要小很多,插入速度要快好幾倍。使用mysqldump導(dǎo)出的文件默認是使用批量插入的方法,導(dǎo)出時可使用--skip-extended-insert 參數(shù)改為逐條插入。下面以一張一千萬的數(shù)據(jù)表為例,測試下不同方式導(dǎo)出的文件插入時的速度。

上圖可以看出,使用擴展插入的SQL腳本導(dǎo)入大概需要10分鐘左右,而一條條插入的SQL腳本導(dǎo)入時間過長,大概1個小時仍然沒有導(dǎo)完,一個2個多G的文本導(dǎo)入一個多小時仍未結(jié)束,等不及的筆者就手動取消了? 不過還是可以看出多條一起insert比一條條插入數(shù)據(jù)要節(jié)省數(shù)倍的時間。

2.嘗試修改參數(shù)加快導(dǎo)入速度

在MySQL中,有一對大名鼎鼎的“雙一”參數(shù),即 innodb_flush_log_at_trx_commit 與 sync_binlog 。為了安全性這兩個參數(shù)默認值為1,為了快速導(dǎo)入腳本,我們可以臨時修改下這兩個參數(shù),下面簡單介紹下這兩個參數(shù):

innodb_flush_log_at_trx_commit默認值為1,可設(shè)置為0、1、2

如果innodb_flush_log_at_trx_commit設(shè)置為0,log buffer將每秒一次地寫入log file中,并且log file的flush(刷到磁盤)操作同時進行.該模式下,在事務(wù)提交的時候,不會主動觸發(fā)寫入磁盤的操作。
如果innodb_flush_log_at_trx_commit設(shè)置為1,每次事務(wù)提交時MySQL都會把log buffer的數(shù)據(jù)寫入log file,并且flush(刷到磁盤)中去.
如果innodb_flush_log_at_trx_commit設(shè)置為2,每次事務(wù)提交時MySQL都會把log buffer的數(shù)據(jù)寫入log file.但是flush(刷到磁盤)操作并不會同時進行。該模式下,MySQL會每秒執(zhí)行一次 flush(刷到磁盤)操作。

sync_binlog默認值為1,可設(shè)置為[0,N)
當(dāng)sync_binlog =0,像操作系統(tǒng)刷其他文件的機制一樣,MySQL不會同步到磁盤中去而是依賴操作系統(tǒng)來刷新binary log。
當(dāng)sync_binlog =N (N>0) ,MySQL 在每寫 N次 二進制日志binary log時,會使用fdatasync()函數(shù)將它的寫二進制日志binary log同步到磁盤中去。

這兩個參數(shù)可以在線修改,若想快速導(dǎo)入,可以按照下面步驟來操作:

# 1.進入MySQL命令行 臨時修改這兩個參數(shù)
set global innodb_flush_log_at_trx_commit = 2;
set global sync_binlog = 2000;

# 2.執(zhí)行SQL腳本導(dǎo)入
mysql -uroot -pxxxxxx testdb  testdb.sql

# 3.導(dǎo)入完成 再把參數(shù)改回來
set global innodb_flush_log_at_trx_commit = 1;
set global sync_binlog = 1;

還有另外一種場景是你的需求是新建從庫,或者是不需要產(chǎn)生binlog,這時候?qū)隨QL腳本時可以設(shè)置暫時不記錄binlog,可以在腳本開頭增加 set sql_log_bin=0; 然后再執(zhí)行導(dǎo)入,這樣速度會進一步加快。如果你的MySQL實例沒有開啟binlog則不需要再執(zhí)行該語句了。

總結(jié):

本篇文章主要介紹快速導(dǎo)入數(shù)據(jù)的方法,可能還有其他方法快速導(dǎo)入數(shù)據(jù),比如load data或者寫程序多線程插入。本文中介紹的方法只適合手動導(dǎo)入SQL腳本,下面總結(jié)下本文中提到的方法。

  1. 使用MySQL自帶的命令行工具進行導(dǎo)出導(dǎo)入。
  2. 使用擴展插入方法,一個insert對于多個值。
  3. 臨時修改innodb_flush_log_at_trx_commit和sync_binlog參數(shù)。
  4. 關(guān)閉binlog或者臨時不記錄binlog。

其實還有一些其他方案,比如先不創(chuàng)建索引,插入數(shù)據(jù)后再執(zhí)行添加索引操作;或者先將表改為MyISAM或MEMORY引擎,導(dǎo)入完成后再改為InnoDB引擎。不過這兩種方法實施起來較為麻煩且不知效果如何。以上方法只是筆者依據(jù)個人經(jīng)驗總結(jié)得出,可能不太全面,歡迎各位補充哦。

以上就是MySQL如何快速導(dǎo)入數(shù)據(jù)的詳細內(nèi)容,更多關(guān)于MySQL導(dǎo)入數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • hive從mysql導(dǎo)入數(shù)據(jù)量變多的解決方案
  • MySQL 4種導(dǎo)入數(shù)據(jù)的方法
  • mysql如何利用Navicat導(dǎo)出和導(dǎo)入數(shù)據(jù)庫的方法
  • Java利用MYSQL LOAD DATA LOCAL INFILE實現(xiàn)大批量導(dǎo)入數(shù)據(jù)到MySQL
  • MySQL命令行導(dǎo)出導(dǎo)入數(shù)據(jù)庫實例詳解
  • wampserver下mysql導(dǎo)入數(shù)據(jù)庫的步驟
  • MySQL命令行導(dǎo)出與導(dǎo)入數(shù)據(jù)庫
  • 使用mysqldump導(dǎo)入數(shù)據(jù)和mysqldump增量備份(mysqldump使用方法)
  • MYSQL 導(dǎo)入數(shù)據(jù)的幾種不同
  • 修改php.ini實現(xiàn)Mysql導(dǎo)入數(shù)據(jù)庫文件最大限制的修改方法
  • .Net Core導(dǎo)入千萬級數(shù)據(jù)至Mysql的步驟

標簽:北京 鷹潭 阜新 臺灣 鎮(zhèn)江 日照 合肥 貴州

巨人網(wǎng)絡(luò)通訊聲明:本文標題《MySQL如何快速導(dǎo)入數(shù)據(jù)》,本文關(guān)鍵詞  MySQL,如何,快速,導(dǎo)入,數(shù)據(jù),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL如何快速導(dǎo)入數(shù)據(jù)》相關(guān)的同類信息!
  • 本頁收集關(guān)于MySQL如何快速導(dǎo)入數(shù)據(jù)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    图木舒克市| 交口县| 饶平县| 法库县| 洛宁县| 贵南县| 靖边县| 乌拉特中旗| 呼玛县| 临漳县| 丁青县| 团风县| 咸阳市| 汕头市| 甘孜| 商河县| 天峻县| 奈曼旗| 榆社县| 黑龙江省| 梁河县| 榆林市| 腾冲县| 金阳县| 鲁山县| 怀远县| 常德市| 丹棱县| 岑溪市| 祁东县| 桦南县| 汽车| 宜宾市| 左权县| 阳朔县| 澎湖县| 涟源市| 嘉黎县| 锡林郭勒盟| 家居| 新乐市|