[英]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.