我正在为客户处理大型数据库移动。我们有一个查询会提取大量数据,需要对其进行处理然后插入到另一个表中。原始查询是将多个表连接在一起以获取所需格式的组合。
我们正在使用自己的数据库类来放置查询的整个结果(大约 600,000 行,30 列数据,主要是字符串)。这个数组被传递给另一个类(它扩展了 ArrayIterator)来做一些操作,然后插入到目标数据库表中。
发现它可以很好地处理小型数据集并且速度相当快。但是随着这次导入超过一百万行,它似乎变得越来越慢。我们使用处理过去导入所花费的时间计算了估计剩余时间,但似乎在过去 3 小时内估计有 2 小时下雨。
最初它每秒处理一百个左右,现在它只有 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;
}
}
对逐渐放缓有什么想法吗?有什么提高效率的建议吗?