共計 2035 個字符,預計需要花費 6 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
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 則不需要再執行該語句了。
關于 MySQL 中怎么實現快速插入數據問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注丸趣 TV 行業資訊頻道了解更多相關知識。
向 AI 問一下細節