选择,编辑然后将数据插入新数据库

时间:2016-12-08 18:51:39

标签: php mysql sql performance insert

SELECT all from MYSQL DATABASE_1几乎每个项目编辑的最佳方法是什么(拆分,合并,验证电子邮件格式,验证网址格式等) - 使用php然后INSERT INTO新{{1} }。

旧表有近300万行。

如果我为每一行做 foreach (这不是一个好主意:))2千行需要1小时以上。

如果我在一个查询中插入多行:

DATABASE 2

几乎相同

如何以专业和快速的方式做到这一点?

1 个答案:

答案 0 :(得分:0)

你可以分页查询并使用几个php进程。例如,一个进程检索并编辑插入新DB的100000个元素。

要实现它,您可以创建一个php父进程,将工作负载分配到子进程中,如下所示:

$total_rows = //Get from your mysql table
$offsets = []
$limit = 10000;

//Create offsets to process in bulk
for ($i=0 ; $i<$total_rows ; $i++) {
    $offsets[] = ($i * limit);
}

//Process rows
while ($processed_rows < $total_rows)

    $pids = [];

    //Create 10 childs processes
    for ($i=0;$i<10;$i++) {
        if ($pid) {
            $pids[] = $pid;
        } else {

            //Get next offset to process
            $offset = array_shift ($offsets);
            process_and_insert_row($offset, $limit); //this function gets, edits and inserts items
        }   
    }

    //Wait for childs to finish
    foreach ($pids as $pid) {
        pcntl_waitpid($pid, $status);
        $processed_rows += $limit;
        unset($pids[$pid]);
    }
}

警告:代码未经过测试,但我认为它证明了解释背后的想法......