У меня есть настройка PHP-скрипта, которая анализирует файл JSON, который разбивается на несколько страниц.MySQL multi_query Очень медленно, альтернатива для простого запроса на усечение?
Этот PHP-скрипт анализирует JSON и вставляет его в базу данных MySQL.
На одном запросе ... (без TRUNCATE
заявления):
if ($count > 0) {
//check toperform operation
foreach ($jsondecode as $entries) {
//getting variables here
$sql = "INSERT INTO table (title, handle, imagesrc)
VALUES ('".$title."', '".$handle."', '".$imagesrc."')";
if ($connect->query($sql) === TRUE) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "<br>" . $connect->error;
}
}
}
успешно Результаты с script execution time: 16.451724052429
На multi_query ....:
if ($count > 0) {
$sql = "TRUNCATE table;";
foreach ($jsondecode as $entries) {
//getting variables here
$sql.= "INSERT INTO table (title, handle, imagesrc)
VALUES ('".$title."', '".$handle."', '".$imagesrc."')";
if (!$mysqli->multi_query($sql)) {
echo "Multi query failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
do {
if ($res = $mysqli->store_result()) {
var_dump($res->fetch_all(MYSQLI_ASSOC));
$res->free();
}
} while ($mysqli->more_results() && $mysqli->next_result());
}
}
Результаты успешно с script execution time: 278.05182099342
, почти 5 минут.
Все, что я пытаюсь сделать, это TRUNCATE
таблица перед INSERT
.
Я собираюсь запустить это на задании CRON веб-сервера, который будет выполнять этот скрипт каждые 12 часов.
Существует, очевидно, такая огромная разница во времени выполнения в одном запросе и многопроцессовом ... есть ли что-нибудь, что я могу сделать?
Моя единственная мысль - установить еще один скрипт задания CRON, который просто выполняет оператор TRUNCATE
каждые 12 часов, но за 1 минуту до этого основного запуска. Кажется, что это должно сработать ... но, конечно, не идеально, так как тогда мне придется иметь дело с несколькими сценариями, а не с одним.
Несмотря на то, что вы не можете ответить на ваши вопросы, но вы можете запятой отдельно отнести свои значения вставки и запустить его как один запрос для нескольких элементов. например, 'значения (a, b, c), (d, e, f), (g, h, i)' – Scuzzy
Выполните 'insert' после того, как запрос будет построен, а не для каждой итерации. – chris85