成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL如何快速插入數據

數據庫 MySQL
日常學習和工作中,經常會遇到導數據的需求。比如數據遷移、數據恢復、新建從庫等,這些操作可能都會涉及大量數據的導入。有時候導入進度慢,電腦風扇狂轉真的很讓人崩潰,其實有些小技巧是可以讓導入更快速的,本篇文章筆者會談一談如何快速的導入數據。

前言:

日常學習和工作中,經常會遇到導數據的需求。比如數據遷移、數據恢復、新建從庫等,這些操作可能都會涉及大量數據的導入。有時候導入進度慢,電腦風扇狂轉真的很讓人崩潰,其實有些小技巧是可以讓導入更快速的,本篇文章筆者會談一談如何快速的導入數據。

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

1.盡量減小導入文件大小

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

  1. # 導出整個實例 
  2. mysqldump -uroot -pxxxxxx --all-databases > all_database.sql 
  3.  
  4. # 導出指定庫 
  5. mysqldump -uroot -pxxxxxx --databases testdb > testdb.sql 
  6.  
  7. # 導出指定表 
  8. mysqldump -uroot -pxxxxxx testdb test_tb > test_tb.sql  
  9.  
  10. # 導入指定SQL文件 (指定導入testdb庫中) 
  11. mysql -uroot -pxxxxxx testdb < testdb.sql 

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

MySQL如何快速插入數據

截圖

上圖可以看出,使用擴展插入的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. # 1.進入MySQL命令行 臨時修改這兩個參數 
  2. set global innodb_flush_log_at_trx_commit = 2; 
  3. set global sync_binlog = 2000; 
  4.  
  5. # 2.執行SQL腳本導入 
  6. mysql -uroot -pxxxxxx testdb < testdb.sql 
  7.  
  8. # 3.導入完成 再把參數改回來 
  9. set global innodb_flush_log_at_trx_commit = 1; 
  10. set global sync_binlog = 1; 

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

總結:

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

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

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

 

責任編輯:龐桂玉 來源: 今日頭條
相關推薦

2024-07-04 13:42:12

2025-05-12 01:55:00

MySQL存儲數據

2025-06-26 08:22:03

2024-04-15 08:30:53

MySQLORM框架

2021-04-08 10:55:53

MySQL數據庫代碼

2010-06-12 10:22:15

MySQL插入數據

2017-11-22 15:33:56

MySQL快速插入語句優化

2011-08-16 09:21:30

MySQL大數據量快速語句優化

2017-05-31 16:10:45

MySQL誤操作恢復數據

2018-09-13 15:20:24

數據庫MySQLSQL

2011-08-04 18:00:47

SQLite數據庫批量數據

2010-05-18 14:04:51

MySQL語句

2010-11-22 16:05:53

MySQL多表插入

2010-06-10 17:29:52

MySQL插入數據

2025-01-08 12:36:52

2022-05-18 08:25:59

MySQLutf8字符集數據庫

2021-09-14 13:15:43

MySQL數據庫腳本

2021-06-28 10:25:47

MySQL數據庫重復數據

2020-09-18 10:18:08

MySQL數據插入數據庫

2020-08-27 07:29:01

MySQL數據數據表
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲91 | 久久久亚洲一区 | 妖精视频一区二区三区 | 久久久久久成人 | 国产成人精品免费视频大全最热 | 欧美精品一区二区三区在线播放 | 久久久久九九九九 | 一区二区三区四区在线免费观看 | 伊人在线 | 国内91在线 | 色视频成人在线观看免 | 日本三级视频 | 日本一二三区高清 | 免费一级网站 | 最新国产福利在线 | 欧美日本免费 | chengrenzaixian | 欧美日韩国产综合在线 | 久久久蜜桃一区二区人 | 中国一级大黄大片 | 中文字幕第十一页 | www.久久 | 在线精品一区 | 国产日韩欧美 | 午夜精品在线观看 | 亚洲综合日韩精品欧美综合区 | 在线观看免费黄色片 | 韩日三级 | 国产大毛片| 色香婷婷| 免费的av网站 | 中文天堂在线一区 | 欧美区日韩区 | 成人av一区二区在线观看 | 夜夜撸av| 一级二级三级在线观看 | 99精品免费久久久久久久久日本 | 亚洲国产精选 | 国产一区2区 | www.日韩av.com | 天天干天天爽 |