Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 优化超长数据文件的推进数据插入_Php_Database_Orm_Propel - Fatal编程技术网

Php 优化超长数据文件的推进数据插入

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表中不存在这

我正在阅读一个很长的文本文件,其中每一行由一个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下插入数据

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();