Вложенный цикл по каждому элементу занимает слишком много времени

Я использую цикл Nested Foreach для хранения данных в MySQL. Но это занимает слишком много времени на обработку. Как я могу уменьшить максимальное время выполнения.

foreach ($results as $r) {
    mysqli_query($con,"insert into commercial values('".mysqli_real_escape_string($con,$r['MST_MLS_NUMBER'])."')");
    $val=1;
    $objects = $rets->GetObject('Property', 'Photo', $r['MST_MLS_NUMBER'], '*', 0);
    foreach ($objects as $pho) {
        mysqli_query($con,"insert into cmtval values('".mysqli_real_escape_string($con,$r['MST_MLS_NUMBER'])."')");
    }
}

3 ответа

Решение

Вы должны использовать массовую вставку

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

По циклу foreach вы должны сначала выполнить запрос, а затем выполнить запрос с mysqli_query,

$query1 = "insert into commercial values ";
$query2 = "insert into cmtval values ";
foreach ($results as $r)
{
     $query1 .= "('" . mysqli_real_escape_string( $con, $r['MST_MLS_NUMBER']) . "'), ";

     $val=1;
$objects = $rets->GetObject('Property', 'Photo', $r['MST_MLS_NUMBER'], '*', 0);
  foreach ($objects as $pho)
  {
     $query2 .= "('" . mysqli_real_escape_string( $con, $r['MST_MLS_NUMBER']) . "'), ";
  }
}

mysqli_query($con, $query1);
mysqli_query($con, $query2);

Я не проверял код. Проверьте и дайте мне знать, если что-то не хватает. Пакетные обновления сокращают некоторое время.

Также, если вы сохраняете слишком много данных в БД в одном запросе и если у вас слишком много индексов, для вставки данных требуется время.

Вы можете использовать оператор подготовки и выполнять с различными значениями для вставки

Например

// prepare and bind
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);

// set parameters and execute
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();

$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();

$firstname = "Julie";
$lastname = "Dooley";
$email = "julie@example.com";
$stmt->execute();

Установить параметры и выполнить строку должно быть в вашем цикле foreach.

Подготовленные операторы и связанные параметры Подготовленный оператор - это функция, используемая для многократного выполнения одних и тех же (или похожих) операторов SQL с высокой эффективностью.

Подготовленные заявления в основном работают так:

Подготовка: шаблон оператора SQL создается и отправляется в базу данных. Определенные значения остаются неуказанными, они называются параметрами (помечены "?"). Пример: INSERT INTO MyGhest VALUES(?,?,?) База данных анализирует, компилирует и выполняет оптимизацию запросов для шаблона оператора SQL и сохраняет результат без его выполнения. Выполнить: позднее приложение связывает значения с параметры, и база данных выполняет оператор. Приложение может выполнить инструкцию столько раз, сколько захочет, с разными значениями.

Вы можете сделать что-то вроде этого

foreach ($results as $r)
{
  mysqli_query($con,"insert into commercial values('".mysqli_real_escape_string($con,$r['MST_MLS_NUMBER'])."')");

    $val=1;
    $objects = $rets->GetObject('Property', 'Photo', $r['MST_MLS_NUMBER'], '*', 0);


    // generate partial query strings for insert multiple records
    $numbers=array();
    foreach ($objects as $pho)
    {
        $numbers[]= "('".mysqli_real_escape_string($con,$pho['MST_MLS_NUMBER'])."')";

    }

    mysqli_query($con,"insert into cmtval values".implode(",",$numbers)); // it will insert multiple record 
}
Другие вопросы по тегам