PHP在mysql的巨大数组中迭代

PHP在mysql的巨大数组中迭代,php,mysql,arrayiterator,Php,Mysql,Arrayiterator,我正在为客户机处理一个大型数据库移动。我们有一个查询,它提取了大量数据,这些数据需要处理,然后插入到另一个表中。原始查询是将多个表连接在一起以获得所需格式的组合 我们使用自己的数据库类来放置查询的整个结果,大约600000行,30列数据,主要是字符串。该数组被传递到另一个类中,该类扩展了ArrayIterator以执行一些操作,然后插入到目标数据库表中 我们发现,它可以很好地处理小数据集,而且速度相当快。但是,由于这个导入超过50万行,它似乎变得越来越慢。我们使用处理过去的进口所需的时间计算了剩

我正在为客户机处理一个大型数据库移动。我们有一个查询,它提取了大量数据,这些数据需要处理,然后插入到另一个表中。原始查询是将多个表连接在一起以获得所需格式的组合

我们使用自己的数据库类来放置查询的整个结果,大约600000行,30列数据,主要是字符串。该数组被传递到另一个类中,该类扩展了ArrayIterator以执行一些操作,然后插入到目标数据库表中

我们发现,它可以很好地处理小数据集,而且速度相当快。但是,由于这个导入超过50万行,它似乎变得越来越慢。我们使用处理过去的进口所需的时间计算了剩余的估计时间,但似乎估计过去3小时的降雨时间为2小时

最初它每秒处理大约100次,现在只有2-3次

下面是我们的代码示例:

$sql = "some query";
$array = new Import($sql);

foreach($array as $data){
    $db->insert('table', $data);
}
迭代器类的演示:

 class Import extends ArrayIterator {

    public function __construct($sql){
        //database class parses query and returns all the results into an array
        $array = $db->getArray($sql)

        parent::__construct($array);
    }

    public function current() {
        $data = parent::current();

        //come data processing...

        return $data; 
    }

}

对逐渐放缓有什么看法?有没有关于提高其效率的建议?

逐渐变慢可能是因为您试图将这么多行加载到内存中。处理是否需要知道它周围的行中发生了什么,或者您可以对每一行进行原子操作?如果是后者,请尝试这样做:拉一行,摆弄它,推一行,然后抓取下一行。我相信您已经完成了解释查询,以了解MySQL是如何获取数据的。所有内容都正确索引了吗?查询本身只需几秒钟即可运行高度优化的索引。查询已完成运行,数组已填充。我们确实想知道如何将行加载到内存中我假设只有被处理的行在内存中,这解释了逐渐变慢的原因。在ArrayIterator中处理完行之后,我找不到多少关于清除行的文档。理想情况下,我们希望在处理前一行时取消设置/清除或从内存中删除前一行。有什么办法吗?