PHP MYSQL通过大结果循环

时间:2018-07-13 19:32:36

标签: php mysql

我有一个很大的mysql结果集,我在遍历时将其插入其他表中。

//Code
$result= mysqli_query($daffff, "select * from 0_suppliers");
    while ($tran_pucha1we = mysqli_fetch_array($result)) {
       //Several Inserts here
    }

结果集包含约3000个供应商,并且在循环中,我将其插入其他4个不同的表中,这使过程超时。

有什么方法可以处理如此大的结果集而无需超时?

4 个答案:

答案 0 :(得分:2)

您应该将INSERT查询与SELECT语句一起使用,这要快得多。示例:

INSERT INTO table (column1, column2)
SELECT column1, 
column2 
FROM table2

其中table2是您的表0_供应商。

答案 1 :(得分:2)

  • 显式使用事务而不是依靠自动提交来减少开销。您可以在一个事务中执行许多语句。但是12,000可能是我有信心进行一次交易的上限。

    mysqli_begin_transaction($daffff);
    $result= mysqli_query($daffff, "select * from 0_suppliers");
    while ($tran_pucha1we = mysqli_fetch_array($result)) {
       //Several Inserts here
    }
    mysqli_commit($daffff);
    
  • 在循环之前准备INSERT语句,然后在循环内重复执行它们。

    $result= mysqli_query($daffff, "select * from 0_suppliers");
    
    $insert1 = mysqli_prepare($daffff, "INSERT INTO MyTable1 (col1, col2, col3) VALUES (?, ?, ?)");
    $insert2 = mysqli_prepare($daffff, "INSERT INTO MyTable2 (col1, col2, col3) VALUES (?, ?, ?)");
    
    while ($tran_pucha1we = mysqli_fetch_array($result)) {
    
       mysqli_stmt_bind_param($insert1, "sss", $tran_pucha1we[0], $tran_pucha1we[1], $tran_pucha1we[2]);
       mysqli_stmt_execute($insert1);
    
       mysqli_stmt_bind_param($insert2, "sss", $tran_pucha1we[3], $tran_pucha1we[4], $tran_pucha1we[5]);
       mysqli_stmt_execute($insert2);
    
    }
    
  • 收集一堆SELECT查询的行,并使用多行插入语法。

    INSERT INTO MyTable (col1, col2, col3) VALUES
      (?, ?, ?), (?, ?, ?), (?, ?, ?), ...
    

您可以结合以上所有技术。

您可能还想知道可以更改PHP超时。看到以下问题:How to increase the execution timeout in php?

答案 2 :(得分:0)

这是使用您的代码的分页 这是超时证明,但因此很脆弱。也许不要用这个,只是个主意。

$howMany = queryExec("select count(*) from 0_suppliers") -> fetch_array()[0];
$current = 0;
// this is how many records to process per loop, if it times out still, make it smaller.   
$numToProcess = 100;

// this is what you really came for...  but be careful:
set_time_limit();

while($current <= $howMany){
    $result= mysqli_query($daffff, "select * from 0_suppliers limit $numToProcess, $current");
    while ($tran_pucha1we = mysqli_fetch_array($result)) {
       //Several Inserts here

       $current++;
    }
}
正如许多其他人所建议的那样,如果可能的话,重构并进行多行插入确实是一个更好的主意,这要快得多。

答案 3 :(得分:0)

我建议使用limitoffset

MySQL限制和抵销文档可在here中找到。

可以找到示例here