Php 优化超长数据文件的推进数据插入
我正在阅读一个很长的文本文件,其中每一行由一个ID、groupID和其他数据组成。每个ID可以与多个groupID关联(第1、2、3行),每个ID groupID组合可以与多个数据关联(第2、3行) 我正在将这些数据移动到数据库中,因此我有一个用于ID的表(无ID重复)、一个用于ID和groupID的表(无ID groupID重复)以及一个用于引用ID groupID表的数据表 因此,为了向数据库中插入一行,我首先检查ID表中是否不存在该ID,然后插入它。然后检查ID groupID表中不存在这个ID groupID组合,然后插入它。最后,在这个ID groupID下插入数据Php 优化超长数据文件的推进数据插入,php,database,orm,propel,Php,Database,Orm,Propel,我正在阅读一个很长的文本文件,其中每一行由一个ID、groupID和其他数据组成。每个ID可以与多个groupID关联(第1、2、3行),每个ID groupID组合可以与多个数据关联(第2、3行) 我正在将这些数据移动到数据库中,因此我有一个用于ID的表(无ID重复)、一个用于ID和groupID的表(无ID groupID重复)以及一个用于引用ID groupID表的数据表 因此,为了向数据库中插入一行,我首先检查ID表中是否不存在该ID,然后插入它。然后检查ID groupID表中不存在这
does this $id exist in the IDs table
if($id doesn't exist in the IDs table){
insert a new ID()
save()
}
does this ID-groupID combo exist in the ID-groupID table
if(doesn't exist){
create new id-groupid combo
}
does this data exist under the third table in association with this id-groupid combo
if(doesn't exist){
insert it
}
问题是,因为文件非常大(100000行),所以这个过程需要几个小时才能完成。我可以做些什么来优化我的查询吗?或者改进数据库的设计?您应该使用。PDO为您提供了一些性能和安全改进。此外,PDO和MySQLi模块支持,这很可能是您正在寻找的
如果只执行INSERT/UPDATE/SELECTS,则事务将被缓存并一次性执行,而不是每次调用它。这非常适合有循环的场景
例如:
$pdo = new PDO(...);
$pdo->beginTransaction();
foreach($array as $ar){
$pdo->query('INSERT INTO...');
}
$pdo->commit();
看一看
它指向了一篇关于大规模插入的推进优化的文章。它是用法语写的,但很容易理解。我以前使用PDO,几年前我搬到了propel orm。但是+1的帮助。你把它贴在你使用的推进,完全错过了它谢谢你的链接。本文建议使用
sprip::disableInstancePooling()代码>并表示它有助于内存消耗。这非常有用,但你确定这解决了我的问题吗?因为我还没有遇到内存问题(我已经设置了足够高的内存限制)。我关心的是如何优化查询:我对源文件中的每一行执行3次检查和最多3次插入。
$pdo = new PDO(...);
$pdo->beginTransaction();
foreach($array as $ar){
$pdo->query('INSERT INTO...');
}
$pdo->commit();