@emerysh

Скорость записи в бд?

Получаю json - декодирую - через foreach обновляю в бд - около 2-3к записей - выполняется 3-5 мин. В чем проблема?
Можно ли ускорить до 1 мин?
Нормальная ли это скорость?
Сам код
$url = $site;
	$file = file_get_contents($url);
	$jsondate = json_decode($file, true);


	foreach ($jsondate as $k => $value) {
		$keys = array_values($value);
		foreach ($keys as $bo) {
			$name= $bo['name'];
			$price = $bo['price'];
			///////////////////////
			$name= mysqli_real_escape_string($link, $name);
			///////////////////////
			$sql = mysqli_query($link,"UPDATE 	`price` SET `price`='$price' WHERE `name`='$name'");
		}
	}
  • Вопрос задан
  • 848 просмотров
Пригласить эксперта
Ответы на вопрос 3
@BorisKorobkov Куратор тега PHP
Web developer
Ненормально.
1. Обновлять надо по первичному ключу (ID), а не имени
2. Выполнять надо не 3-4К запросов, а 4 шт. Как сформировать 1 запрос UPDATE с тысячей значений?
Ответ написан
Arris
@Arris
Сапиенсы учатся, играя.
Комментировать
FanatPHP
@FanatPHP
Чебуратор тега РНР
Как всегда, милилон ответов, все не в кассу.

Правильный ответ - завернуть запросы в транзакцию.
Все остальные правки в коде не имеют отношения к принципиальному ускорению, и сделаны только затем, чтобы код выглядел не так позорно.

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link->begin_transaction();
$stmt = $link->prepare("UPDATE `price` SET `price`=? WHERE `name`=?");
$stmt->bind_param("ss", $price, $name);
foreach ($jsondate as $k => $value) {
    foreach ($value as $bo) {
        $name = $bo['name'];
        $price = $bo['price'];
        $stmt->execute();
    }
}
$link->commit();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы