Есть ли более быстрый способ импортировать данные из файла в MySQL с помощью 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;

Однако это занимает много времени. Есть ли более быстрый способ сделать это, или я застрял с этим методом?

PS. Я не хочу использовать MySQL «INSERT DATA INFILE».

1

Решение

Как написано, вы запускаете оператор вставки для каждой строки. Это будет намного быстрее, если вы скомпилируете один оператор multi-insert в формате 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.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]