2016-08-03 66 views
1

我正在使用嵌套的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

是'$ R [“MST_MLS_NUMBER”]'和'$ PHO [“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); 

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

我还没有测试过代码。测试并让我知道是否有缺失。批量更新减少了一些时间。

另外,如果您在单个查询中将太多数据保存在数据库中,并且索引过多,则需要时间来插入数据。

+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/stored-image-in-database-directly-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 语句模板执行查询优化,并存储结果而不执行它 执行:稍后,应用程序将绑定值设为 参数,数据库执行该语句。该应用程序 ,因为它与不同 值