簡體   English   中英

有沒有更快的方法使用PHP將數據從文件導入MySQL?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM