1

ネストされた 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'])."')");
    }
}
4

3 に答える 3

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 = "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 MyGuests VALUES(?, ?, ?) データベースは、SQL ステートメント テンプレートでクエリの最適化を解析、コンパイル、実行し、実行せずに結果を格納します。 実行: 後で、アプリケーションは値をパラメータを指定し、データベースが文を実行します。アプリケーションは、異なる値を使用してステートメントを何度でも実行できます。

于 2016-08-03T07:32:37.867 に答える
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 
}
于 2016-08-03T07:18:16.547 に答える
0

一括挿入を使用する必要があります

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);

私はコードをテストしていません。テストして、何か不足している場合はお知らせください。バッチ更新により、時間が短縮されます。

また、単一のクエリで DB に保存するデータが多すぎる場合や、インデックスが多すぎる場合は、データの挿入に時間がかかります。

于 2016-08-03T07:16:34.273 に答える