0

ここでいくつかの支援を期待しています。大きなxmlファイル(上記のコードではxml-file.xmlと呼ばれます)があります。上記のコードで私が抱えている問題は、データベースへのすべての書き込みが非常に遅いことです。遅いのは、映画をループして、コンマ区切りの文字列で映画名だけをテーブルに書き込むセクションがあるためだと思います。私の質問-映画の名前をコンマ区切りの文字列に変換してからテーブルに書き込むためのより効率的な方法はありますか?助けてくれてありがとう!

XMLマークアップ:

    <users>
      <user>
        <id>7280462</id>
        <name>John</name>
        <movies>
          <name>
            <![CDATA[Jack]]>
          </name>
          <description>
            <![CDATA[comedy]]>
          </description>
          <name>
            <![CDATA[Superman]]>
          </name>
          <description>
            <![CDATA[action]]>
          </description>
          <name>
            <![CDATA[Ace Venture]]>
          </name>
          <description>
            <![CDATA[comedy]]>
          </description>
          <name>
            <![CDATA[Major League]]>
          </name>
          <description>
            <![CDATA[sports]]>
          </description>
        </movies>
      </user>
    </users>

私のPHPコード:

    $file = 'xml-file.xml';
    $users = simplexml_load_file($file);

    $num_rows = count($users);
    for ($j=0; $j < $num_rows; $j++) { 
        $userid = $users->user[$j]->id;
        $name = $users->user[$j]->name;

        //update table with userid and name
        $db->exec("INSERT INTO table (userid, name) VALUES ('$userid', '$name')");

            //loop through movies and write only movie name to table as comma separated string
            foreach ($users->user$j]->movies as $element) {
              foreach($element as $key => $val) {
                  if ($key != 'description') {
                       //echo "{$key}: {$val}";
                       $title = trim($val).',';
                      $db->exec("UPDATE table set movies = concat(movies,'','$title') where userid = '$userid'");
                    }
              }
            }

    }
4

2 に答える 2

1

これはどう:

for ($j=0; $j < $num_rows; $j++) { 
    $userid = $users->user[$j]->id;
    $name = $users->user[$j]->name;
    $titles = "";

    foreach ($users->user$j]->movies as $element) {
        foreach($element as $key => $val) {
            if ($key != 'description') {
                   $titles .= trim($val).',';
            }
        }
    }

    $titles = trim($titles, ",");

    $db->exec("INSERT INTO table (userid, name, movies) VALUES ('$userid', '$name','$titles')");

 }

すべての SQL が一度に生成されるため、必要なステートメントは 1 つだけです。

于 2012-08-17T16:00:38.763 に答える
1

最初にデータベースを更新します。これにより、concat などの使用が回避されます。Google で確認してください。

クエリがインデックスを認識していることを確認するか、インデックスがない場合は作成する必要があります。

EXPLAINMySqlのキーワードは、ここでの友達です。何が起こっているか、何が起こっていないかを教えてくれます。

さらに、XML の形式を変更し、DOM を使用します。

映画の詳細だけを含む「movie」というタグを付けます。

すなわち

<movies>
    <movie>
       <name>Jack</name>
       <description>Comedy</descript>
     </movie>
     <movie>
        <name>Superman</name>
        <description>Action</description>
     </movie>
  ....
</movies>
于 2012-08-17T16:11:30.507 に答える