Я пытаюсь прочитать большой файл XML и ВСТАВИТЬ все данные в базу данных. Я пробую 3 разных сценария (и мне нужна помощь с третьим):
- После каждого элемента XML я делаю один запрос:
$this->mysqli->query($sql);
- Я добавляю все
INSERT
к переменной$sql
и после цикла использую один мультизапрос$this->mysqli->multi_query($sql);
для ВСТАВКИ всех сразу.
Я провел тесты, и оба сценария мне не нравятся:
- Вставляет все данные в БД, но работает 113 секунд. Это не большая проблема, но я хочу сделать лучше!
- Это вариант, который я использую для своих небольших XML-файлов, и он творит чудеса. Для одной из моих функций это сократило время выполнения с 6,5 до 0,17 с и так же точно. Проблема с этим файлом заключается в следующем: этот пакет $sql становится слишком большим, и сценарий становится нестабильным, вывод неверен.
Итак, теперь я придумал третье, гибридное решение. Но это не работает, как ожидалось. Идея заключается в том, чтобы создавать вызов $this->mysqli->muli_query($sql);
после каждых 200 элементов, а затем перезапускать процесс. Я думаю, что мне не хватает правильного понимания функции mysqli->multi_query, потому что для меня приведенный ниже код имеет смысл. Но, может быть, мне нужно что-то освободить / point / next()?
В любом случае: после запуска скрипта база не заполняется полностью.
Как указано ниже моего кода:
if ($xmlObj) {
$sql = "";
$i = 1;
foreach ($xmlObj->Response->FeaturesList->Feature as $feature) {
$sid = $feature["ID"];
$sql .= "INSERT INTO ...;";
// Hybrid solution
if (($i % 200) == 0) {
$this->mysqli->multi_query($sql);
$sql = "";
}
$i++;
}
// Hybrid: Update the leftovers
$this->mysqli->multi_query($sql);
}
ОБНОВЛЕНИЕ Вариант № 4, добавленный Михаем, отлично работает. Я создал строку INSERT..VALUES(a),(b),(c)
и добавил, что использование mysqli->query()
работает 10 секунд и добавляет все элементы. Спасибо
Однако вопрос о загадке multi_query остается!
max_allowed_packet
. - person Marek   schedule 04.08.2015