2016-08-03 5 views
1

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

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'])."')"); 
    } 
} 
+0

Является ли '$ г [«MST_MLS_NUMBER»] и' $ фо [ «MST_MLS_NUMBER»] 'другое значение внутри одного цикла? – jitendrapurohit

+0

Нет его аналогичного значения для однократной обработки внутри одного цикла. Я отредактировал вопрос. –

+0

@Anant Фактически я использую библиотеку для хранения данных MLS. Причина, заключающаяся в том, чтобы взять вложенный цикл, заключается в том, что мне нужно хранить изображения, связанные с одним и тем же номером mls, во время ввода записей. Вызов объекта изображения отличается в библиотеке. –

ответ

0

Вы должны использовать bulk insert

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

По петле Еогеаспа вы должны сделать первый запрос для выполнения, а затем выполнить запрос с 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); 

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

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

+0

Это намного лучший способ, чем мой. но @somnath его занимает время тоже. это может быть из-за того, что я храню данные изображения с кодировкой base64 как тип BLOB в одном запросе.? –

+0

Вот почему его время. потому что кодированное изображение base64 принимает приблизительно 39000 слов в одном кортеже. –

+0

@junkkrr Также см. Https://www.quora.com/Why-would-an-INSERT-query-be-slow-in-MySQL и http: // stackoverflow.com/questions/9722603/storage-image-in-database-direct-or-as-base64-data –

0

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

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 
} 
0

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

Например

// 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 = "[email protected]"; 
$stmt->execute(); 

$firstname = "Mary"; 
$lastname = "Moe"; 
$email = "[email protected]"; 
$stmt->execute(); 

$firstname = "Julie"; 
$lastname = "Dooley"; 
$email = "[email protected]"; 
$stmt->execute(); 

параметры Установить и выполнить линию должен находиться в вашей петле foreach.

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

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

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

Смежные вопросы