![](/img/trans.png)
[英]PHP - Import CSV file to mysql database Using LOAD DATA INFILE
[英]Process large csv file using mysql load data infile
我正在尝试读取具有 500k 行和 81 列的 CSV 文件并将其插入到数据库中。 CSV 大小为 160 MB。 我必须每 3-4 小时处理一次。 每 3-4 小时,我就会有一个新的 CSV 文件,其中包含一些新记录和一些现有记录。 为此,我遵循了许多方法,但没有任何方法可以完美运行。
方法一:读取所有记录,但耗时过长。 读取20万条记录耗时1个多小时,然后超时。
$file = fopen($path, 'r');
while (($line = fgetcsv($file)) !== FALSE) {
}
作为解决方案:我可以增加php限制,执行时间和内存限制来避免这个错误,但我觉得它很慢。
方法二:
$query = "LOAD DATA LOCAL INFILE products.csv INTO TABLE tmp_tbl LINES TERMINATED BY '\\r\\n' FIELDS TERMINATED BY ',' IGNORE 1 LINES";
DB::select($query);
它给出了以下错误。
SQLSTATE[42000]:语法错误或访问冲突:1064 你的 SQL 语法有错误; 检查与您的 MariaDB 服务器版本相对应的手册,了解在第 1 行的“FIELDS TERMINATED BY”、“IGNORE 1 LINES”附近使用的正确语法(SQL: LOAD DATA LOCAL INFILE 'products.csv' INTO TABLE tmp_tbl LINES TERMINATED BY ' \\r\\n' 字段以 ',' 结尾,忽略 1 行)
方法三:
$query = "LOAD DATA LOCAL INFILE 'products.csv' INTO TABLE tmp_tbl LINES TERMINATED BY '\\r\\n' FIELDS TERMINATED BY ',' IGNORE 1 LINES";
DB::connection()->getpdo()->exec($query);
或者
$query = "LOAD DATA LOCAL INFILE '".$file_path."' INTO TABLE tmp_tbl LINES TERMINATED BY '\\n' FIELDS TERMINATED BY ',' IGNORE 1 LINES";
DB::connection()->getpdo()->exec($query);
出现以下错误
SQLSTATE[42000]:语法错误或访问冲突:1064 你的 SQL 语法有错误; 检查与您的 MariaDB 服务器版本相对应的手册,了解在第 1 行的“FIELDS TERMINATED BY”、“IGNORE 1 LINES”附近使用的正确语法
方法四
$query = "LOAD DATA LOCAL INFILE '".$file_path."' INTO TABLE tmp_tbl";
DB::connection()->getpdo()->exec($query);
出现以下错误
PDO::exec(): MySQL 服务器已经消失
方法五
$query = "LOAD DATA LOCAL INFILE '".$file_path."' INTO TABLE tmp_tbl";
DB::select($query);
出现以下错误
SQLSTATE[HY000]:一般错误:2014 无法执行查询,而其他无缓冲查询处于活动状态。 考虑使用 PDOStatement::fetchAll()。 或者,如果您的代码只针对 mysql 运行,您可以通过设置 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性来启用查询缓冲。 (SQL: LOAD DATA LOCAL INFILE 'products.csv' INTO TABLE tmp_tbl)
我应该继续使用哪种方法,为什么会出现所有这些错误? 我想在更短的时间内处理所有记录而不会出现任何错误。
尝试添加这个: DB::connection()->disableQueryLog();
到脚本的顶部 - 您的内存消耗可能来自在内存中存储查询。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.