[英]Is there a faster way to import data from a file to MySQL using php?
好的,所以我得到大約100k-1M的文本行,我總是導入到數據庫中。 我使用的代碼如下:
$lines = new SplFileObject('/home/file.txt');
while(!$lines->eof()) {
$lines->next(); //Skipping first line
$row = explode(',',$lines);
for($i = 0; $i<4; $i++){
if(!isset($row[$i])){
$row[$i] = null;
}
}
$y = (float) $row[1];
$z = (float) $row[2];
$load_query = "INSERT IGNORE INTO new (datetime_gmt,field2,field3)
VALUES ('".$row[0]."','".$y."','".$z."');";
if(!$mysqli->query($load_query)){
die("CANNOT EXECUTE".$mysqli->error."\n");
}
}
$lines = null;
但是,它需要waaayyy太長時間。 有沒有更快的方法,或者我堅持這種方法?
PS。 我不想使用MySQL的“INSERT DATA INFILE”。
如上所述,您正在為每一行運行insert語句。 如果以INSERT INTO table (foo, bar) VALUES (1, 2), (3, 4), (5, 6);
的格式編譯單個多插入語句,它會快得多INSERT INTO table (foo, bar) VALUES (1, 2), (3, 4), (5, 6);
在最后執行一次。 有點像這樣的東西,雖然它可以被清理得更多。
$lines = new SplFileObject('/home/file.txt');
$load_query = "INSERT IGNORE INTO new (datetime_gmt,field2,field3)
VALUES ";
while(!$lines->eof()) {
$lines->next(); //Skipping first line
$row = explode(',',$lines);
for($i = 0; $i<4; $i++){
if(!isset($row[$i])){
$row[$i] = null;
}
}
$y = (float) $row[1];
$z = (float) $row[2];
$load_query .= "('".$row[0]."','".$y."','".$z."'),";
}
if(!$mysqli->query(rtrim($load_query, ','))) {
die("CANNOT EXECUTE".$mysqli->error."\n");
}
$lines = null;
還要確保數據是可信的。 如果文件可以來自外部用戶,則直接追加到查詢字符串會創建SQL注入向量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.