我有一个很大的mysql结果集,我在遍历时将其插入其他表中。
//Code
$result= mysqli_query($daffff, "select * from 0_suppliers");
while ($tran_pucha1we = mysqli_fetch_array($result)) {
//Several Inserts here
}
结果集包含约3000个供应商,并且在循环中,我将其插入其他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)