新聞中心
MySQL中怎么實(shí)現(xiàn)快速插入數(shù)據(jù),針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
為丹徒等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及丹徒網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、丹徒網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
MySQL如何快速插入數(shù)據(jù)
1.盡量減小導(dǎo)入文件大小
首先給個(gè)建議,導(dǎo)出導(dǎo)入數(shù)據(jù)盡量使用MySQL自帶的命令行工具,不要使用Navicat、workbench等圖形化工具。特別是大數(shù)據(jù)量的時(shí)候,用MySQL自帶的命令行工具導(dǎo)出和導(dǎo)入比用Navicat等圖形化工具要快數(shù)倍,而且用Navicat等圖形化工具做大數(shù)據(jù)量的操作時(shí)很容易卡死。下面簡(jiǎn)單介紹下怎么用MySQL自帶的命令行工具做導(dǎo)入導(dǎo)出。
#導(dǎo)出整個(gè)實(shí)例
mysqldump-uroot-pxxxxxx--all-databases>all_database.sql
#導(dǎo)出指定庫(kù)
mysqldump-uroot-pxxxxxx--databasestestdb>testdb.sql
#導(dǎo)出指定表
mysqldump-uroot-pxxxxxxtestdbtest_tb>test_tb.sql
#導(dǎo)入指定SQL文件(指定導(dǎo)入testdb庫(kù)中)
mysql-uroot-pxxxxxxtestdb
導(dǎo)入的SQL腳本內(nèi)容大多是先建庫(kù)建表,然后插入數(shù)據(jù),其中耗時(shí)最長(zhǎng)的應(yīng)該是insert插入數(shù)據(jù)了。為了減小文件大小,推薦使用擴(kuò)展插入方法,即多行一起批量insert,類似這樣:insertintotable_namevalues(),(),(),...,();。使用擴(kuò)展插入比一條條插入,文件大小要小很多,插入速度要快好幾倍。使用mysqldump導(dǎo)出的文件默認(rèn)是使用批量插入的方法,導(dǎo)出時(shí)可使用--skip-extended-insert參數(shù)改為逐條插入。
可以看出,使用擴(kuò)展插入的SQL腳本導(dǎo)入大概需要10分鐘左右,而一條條插入的SQL腳本導(dǎo)入時(shí)間過(guò)長(zhǎng),大概1個(gè)小時(shí)仍然沒(méi)有導(dǎo)完,一個(gè)2個(gè)多G的文本導(dǎo)入一個(gè)多小時(shí)仍未結(jié)束,等不及的筆者就手動(dòng)取消了不過(guò)還是可以看出多條一起insert比一條條插入數(shù)據(jù)要節(jié)省數(shù)倍的時(shí)間。
2.嘗試修改參數(shù)加快導(dǎo)入速度
在MySQL中,有一對(duì)大名鼎鼎的“雙一”參數(shù),即innodb_flush_log_at_trx_commit與sync_binlog。為了安全性這兩個(gè)參數(shù)默認(rèn)值為1,為了快速導(dǎo)入腳本,我們可以臨時(shí)修改下這兩個(gè)參數(shù),下面簡(jiǎn)單介紹下這兩個(gè)參數(shù):
innodb_flush_log_at_trx_commit默認(rèn)值為1,可設(shè)置為0、1、2
如果innodb_flush_log_at_trx_commit設(shè)置為0,logbuffer將每秒一次地寫入logfile中,并且logfile的flush(刷到磁盤)操作同時(shí)進(jìn)行.該模式下,在事務(wù)提交的時(shí)候,不會(huì)主動(dòng)觸發(fā)寫入磁盤的操作。如果innodb_flush_log_at_trx_commit設(shè)置為1,每次事務(wù)提交時(shí)MySQL都會(huì)把logbuffer的數(shù)據(jù)寫入logfile,并且flush(刷到磁盤)中去.如果innodb_flush_log_at_trx_commit設(shè)置為2,每次事務(wù)提交時(shí)MySQL都會(huì)把logbuffer的數(shù)據(jù)寫入logfile.但是flush(刷到磁盤)操作并不會(huì)同時(shí)進(jìn)行。該模式下,MySQL會(huì)每秒執(zhí)行一次flush(刷到磁盤)操作。
sync_binlog默認(rèn)值為1,可設(shè)置為[0,N)
當(dāng)sync_binlog=0,像操作系統(tǒng)刷其他文件的機(jī)制一樣,MySQL不會(huì)同步到磁盤中去而是依賴操作系統(tǒng)來(lái)刷新binarylog。當(dāng)sync_binlog=N(N>0),MySQL在每寫N次二進(jìn)制日志binarylog時(shí),會(huì)使用fdatasync()函數(shù)將它的寫二進(jìn)制日志binarylog同步到磁盤中去。
MySQL如何快速插入數(shù)據(jù)
這兩個(gè)參數(shù)可以在線修改,若想快速導(dǎo)入,可以按照下面步驟來(lái)操作:
#1.進(jìn)入MySQL命令行臨時(shí)修改這兩個(gè)參數(shù)
setglobalinnodb_flush_log_at_trx_commit=2;
setglobalsync_binlog=2000;
#2.執(zhí)行SQL腳本導(dǎo)入
mysql-uroot-pxxxxxxtestdb
#3.導(dǎo)入完成再把參數(shù)改回來(lái)
setglobalinnodb_flush_log_at_trx_commit=1;
setglobalsync_binlog=1;
還有另外一種場(chǎng)景是你的需求是新建從庫(kù),或者是不需要產(chǎn)生binlog,這時(shí)候?qū)隨QL腳本時(shí)可以設(shè)置暫時(shí)不記錄binlog,可以在腳本開(kāi)頭增加setsql_log_bin=0;然后再執(zhí)行導(dǎo)入,這樣速度會(huì)進(jìn)一步加快。如果你的MySQL實(shí)例沒(méi)有開(kāi)啟binlog則不需要再執(zhí)行該語(yǔ)句了。
關(guān)于MySQL中怎么實(shí)現(xiàn)快速插入數(shù)據(jù)問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
文章標(biāo)題:MySQL中怎么實(shí)現(xiàn)快速插入數(shù)據(jù)
網(wǎng)頁(yè)路徑:http://www.ef60e0e.cn/article/ghcceo.html