好的,所以我得到了大约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;
然而,这需要花费太长时间。有没有更快的方法,或者我坚持使用这种方法?
PS。我不想使用MySQL&#34; INSERT DATA INFILE&#34;。
答案 0 :(得分:3)
如上所述,您为每一行运行插入语句。如果以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注入向量。