优化非常长的数据文件的推进数据插入

时间:2012-07-09 16:31:34

标签: php database orm propel

我正在阅读一个很长的文本文件,其中每一行由ID,groupID和其他数据组成。每个ID都可以与许多groupID相关联(第1,2,3行),每个ID-groupID组合可以与许多数据相关联(第2,3行)。

JWOFJ903JCKDF8O | groupID-22 | some data 
JWOFJ903JCKDF8O | groupID-33 | same ID as above, but different groupID and data
JWOFJ903JCKDF8O | groupID-33 | same ID and groupID as above, but different data 
... 
DF8#CKJ90JJ3WOF | groupID-22 | some data 
...

我正在将这些数据移动到数据库中,因此我有一个ID表(没有ID重复),一个ID和groupID表(没有ID-groupID重复),以及一个数据表,引用ID-groupID表。

所以要在数据库中插入1行,我首先检查ID表中是否存在该ID,然后插入它。然后我检查ID-groupID组合中不存在这个ID-groupID组合,然后插入它。最后,在此ID-groupID id下插入数据。

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
}

问题在于,由于文件非常大(100,000行),因此该过程需要数小时才能完成。有什么我可以做的来优化我的推进查询?或者改进数据库的设计?

2 个答案:

答案 0 :(得分:1)

您应该使用PDO。 PDO为您提供了一些性能和安全性改进。此外,PDO和MySQLi模块支持transactions,这很可能是您正在寻找的。

如果您只执行INSERT / UPDATE / SELECTS,则事务将一次缓存并执行,而不是每次调用它。这对于有循环的情况非常适合。

示例:

$pdo = new PDO(...);
$pdo->beginTransaction();

foreach($array as $ar){
    $pdo->query('INSERT INTO...');         
}

$pdo->commit();

答案 1 :(得分:1)

查看his answer

它指向一篇关于Propel优化大量插入的文章。这是法语,但很容易理解。