此問題是前幾天整理數據的時候碰到的,數據存在 CSV
文件中(200多萬記錄),經過python 往數據庫中導入太慢了,後來使用MySQL
中自帶的命令 LOAD DATA INFILE
, 30多秒就可以完成二三百萬的數據量導入。html
LOAD DATA INFILE
命令容許你讀取文本文件而後很是快速的插入數據庫。python
導入文件以前,你須要準備如下的內容:mysql
discounts
的表格,結構以下:咱們使用 [CREATE TABLE statement][1]
命令建立 discounts
表格:linux
CREATE TABLE discounts ( id INT NOT NULL AUTO_INCREMENT, title VARCHAR(255) NOT NULL, expired_date DATE NOT NULL, amount DECIMAL(10 , 2 ) NULL, PRIMARY KEY (id) );
discounts.csv 文件的首行做爲列名稱,其餘三行爲數據。sql
如下的命令使得 c:\tmp\discounts.csv
的文件存入 discounts
表格。數據庫
LOAD DATA INFILE 'c:/tmp/discounts.csv' INTO TABLE discounts FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;
文件中的數據閾由逗號分隔開,代碼中反映爲 FIELD TERMINATED BY ','
,並且數據由雙引號包圍,經過 ENCLOSED BY '" ‘
標明
CSV 中的換行標記由 LINES TERMINATED BY '\n'
進行說明。windows
另外:文件中的首行是標題並須要存入數據庫表格中,所以經過IGNORE 1 ROWS
進行忽略。安全
有時數據的格式並不知足數據庫表格中目標列的格式。簡單的狀況下,你能夠在LOAD DATA INFILE
中設置 set
選項 以轉換數據服務器
假定 discount_2.csv 文件中的過時時間列 是mm/dd/yyyy
的格式。code
當向 discounts 表格中導入數據時,咱們必須經過 str_to_date() function 轉換成MySQL日期的格式
LOAD DATA INFILE 'c:/tmp/discounts_2.csv' INTO TABLE discounts FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS (title,@expired_date,amount) SET expired_date = STR_TO_DATE(@expired_date, '%m/%d/%Y');
使用命令 LOAD DATA INFILE
從客戶端(本地電腦)向遠程MySQL
數據庫導入數據是徹底可行的。
當你使用LOAD DATA INFILE
中的LOCAL
選項,客戶端程序讀取本地的文件,而後將其發送到MySQL server
。文件將被上傳到服務器端相應的臨時目錄內,好比 Windows
中 C:\windows\temp
或 linux
中 /temp
。
此文件夾沒法被MySQL配置或佔用。
咱們看看下面的例子:
LOAD DATA LOCAL INFILE 'c:/tmp/discounts.csv' INTO TABLE discounts FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;
惟一的差異在於命令中的 LOCAL
選項。若是你須要load
一個大的CSV
文件,你會注意到LOCAL
選項,它會比平時慢一些,由於更多時間浪費在數據傳輸上面。
當你使用 LOCAL 選項時,鏈接 MySQL server的帳戶並不須要文件權限來導入數據。
使用 LOAD DATA LOCAL
導入本地文件到遠程 MySQL
服務端,須要注意一些安全問題,你必須意識到這些問題以規避潛在的安全風險。
此文章轉載自:http://www.mysqltutorial.org/import-csv-file-mysql-table/