-3

データベースにインポートする必要がある 65000 レコードの csv ファイルがあります。

次のコードを試しましたが、本当に遅いです。

とにかく、私はこれをより速く行うことができますか?

@set_time_limit(1200);
    $file = './csvFiles/aw_Products.csv';
    $handle = fopen( $file , 'r');
    while (($row = fgetcsv($handle)) !== false) {       
        if( is_integer($row[0]) || $row[0] != 0 )
        {
            $product = new Product();
            $product->merchant_id       = $row[0];
            $product->merc_product_id   = $row[1];
            $product->product_id        = $row[2];
            $product->product_name      = $row[3];
            $product->product_desc      = htmlentities($row[4]);
            //$product->keywords            = htmlentities($row[6]);
            $product->category_id       = $row[5];
            $product->link_url          = $row[6];
            $product->image_url         = $row[7];
            $product->price             = $row[8];
            $product->delivery_cost     = $row[9];
            //$product->deliveryAvailable   = $row[12];
            //$product->deliveryDetails = $row[13];
            //$product->valid_to            = $row[14];
            //$product->valid_from      = ($row[3] == 'yes') ? 1 : 0;

            if( Product::find_by_id( $row[0] ) )
                $product->updateRecord();
            else
                $product->createRecord();
        }
        sleep (1);
    }
    fclose($handle);
4

2 に答える 2

2

sleep()おそらく犯人です。しかし、私はこれについても疑問に思っています:Product::find_by_id()すべての INSERT に対して SELECT クエリを実行している可能性があるからです。単一の SELECT クエリを作成して、既存のすべての DB キーを PHP 配列に取得することを考えるかもしれません。その後、*in_array()* を使用して、UPDATE または INSERT のどちらを行うかを確認できます。言うまでもありませんが、INSERT を実行する場合は、PHP 配列に追加する必要があります。

于 2012-12-16T16:47:11.107 に答える
1

sleep() をあきらめて、mysql の挿入/更新に準備済みステートメントを使用します。

于 2012-12-16T17:26:36.660 に答える