首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套Foreach循环花费了太多时间

问嵌套Foreach循环花费了太多时间
EN

Stack Overflow用户
提问于 2016-08-03 07:12:45
回答 3查看 1K关注 0票数 1

我使用嵌套Foreach循环将数据存储在mysql中。但处理时间太长了。如何减少最大执行时间。

代码语言:javascript
复制
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'])."')");
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-03 07:16:34

你应该使用散装插入

代码语言:javascript
复制
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

通过foreach循环,您应该首先执行查询,然后使用mysqli_query执行查询。

代码语言:javascript
复制
$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中,而如果索引太多,则插入数据需要时间。

票数 0
EN

Stack Overflow用户

发布于 2016-08-03 07:18:16

你可以做这样的事

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-08-03 07:32:37

您可以使用准备语句并使用要插入的不同值执行。

例如

代码语言:javascript
复制
// 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语句模板并将其发送到数据库。某些值未指定,称为参数(标记为"?")。示例:插入到MyGuests值( ?,?,?)数据库对SQL语句模板进行分析、编译和查询优化,并在不执行结果的情况下存储结果:稍后,应用程序将值绑定到参数,数据库执行语句。应用程序可以用不同的值执行它想要的语句多少次。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38736783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档