此问题是前几天整理数据的时候碰到的,数据存在 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/