1

データを含む大きなXMLドキュメント(〜10 mb)があります。このXMLを解析し、データベースを調べて更新する必要があります。3つのケースがあります:

  • 前回から新しいデータがXMLに存在します-それをDBに挿入します
  • アイテムが変更されました-DBで更新してください
  • アイテムは前回からXMLから削除されています-DBで無効としてマークしてください

前回XMLをチェックしてからアイテムのデータが変更されていない場合は、何もしません。XMLの各アイテムには独自のIDがあるため、データベースから簡単に取得できます。

ただし、このようなアイテムを反復処理するのは非常に時間がかかりますが、データベースのリレーショナルな側面が必要です(XMLはユーザーが購入できるアイテムを表すため、アイテムの新しいIDを生成して、それらを一括ロードすることはできません)。

XMLをループして各アイテムを個別に検索するのは非常に遅いため、これを実装するための最良の方法は何でしょうか。

これは、PHPを使用してMySQLデータベースに組み込まれます。

==編集==

このプロセスの基本的なループは次のとおりです。

while ($data = get_next_bit_of_data_from_xml())
{
     // this next line is the slow part
     if ($object = get_object_from_database($data['id']))
     {
           // update $object
           // ...

           // persist 
           $object->save();       
     }

     // build new object and persist
     // ...
}

スクリプトが非常に遅い理由は、XMLのエントリごとにオブジェクトがすでに存在するかどうかを確認する必要があるため、LOADDATAINFILEのようなバルク操作を使用できないためです。

したがって、既存のデータとの参照整合性を維持しながらデータを一括ロードできる別のアプローチを誰かが提案できるかどうか、本当に疑問に思っています。

4

2 に答える 2

2

INSERT ... ON DUPLICATE KEY UPDATE こちらのリンクを参照してください。まず、無効にするすべてのレコードを更新します。次に、上記のINSERT ... ON DUPLICATE KEY UPDATEクエリを実行して、既存の行を新しいデータで挿入または更新し、それらを有効に設定します。

于 2011-06-08T17:07:12.690 に答える
1

と を使用INSERT DELAYEDUPDATE LOW_PRIORITY て、プロセスを高速化できます。

于 2011-06-08T17:07:16.667 に答える