一。MySQL添加csv數據
此問題是前幾天整理數據的時候碰到的,數據存在 CSV
文件中(200多萬記錄),通過python 往數據庫中導入太慢了,后來使用MySQL
中自帶的命令 LOAD DATA INFILE
, 30多秒就能夠完成二三百萬的數據量導入。
LOAD DATA INFILE
命令允許你讀取文本文件然后非常快速的插入數據庫。
導入文件之前,你需要准備以下的內容:
- 創建相應數據的數據庫表格。
- CSV 文件中的數據需要和數據庫表格在列數和數據類型保持一致。
- 具有寫入數據庫的文件和插入權限的賬戶
假定我們擁有一個discounts
的表格,結構如下:
我們使用 [CREATE TABLE statement][1]
命令創建 discounts
表格:
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 文件的首行作為列名稱,其他三行為數據。
以下的命令使得 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'
進行說明。
因為文件第一行包含列名,所以,不應該導入數據表中,這里用 IGNORE 1 ROWS 語句忽略第一行,保證不導入。
二。導入數據轉換格式
有時數據的格式並不滿足數據庫表格中目標列的格式。簡單的情況下,你可以在LOAD DATA INFILE
中設置 set
選項 以轉換數據
假定 discount_2.csv 文件中的過期時間列 是mm/dd/yyyy
的格式。
當向 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');
三。客戶端向遠程MySQL數據庫導入數據
使用命令 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
服務端,需要注意一些安全問題,你必須意識到這些問題以規避潛在的安全風險。