0

一度に200000を超えるレコードをmysqldbテーブルに挿入する必要があります。挿入クエリにより、パフォーマンスの問題が発生します。これに代わるものが考えられます。

以下は私が使用しているコードです

$xml = simplexml_load_file("247electrical.xml");

foreach($xml->merchant as $merchant){

define('API', 'PS');
require_once('constants.inc.php');
require_once('classes/class.ClientFactory.php');
$oClient = ClientFactory::getClient(API_USERNAME, API_PASSWORD, API_USER_TYPE); $merchattrs=$merchant->attributes();
$aParams100 = array('iMerchantId' => array($merchattrs->id)); $merchantinfo= $oClient->call('getMerchant', $aParams100);

//Get Products

foreach($xml->merchant->prod as $product){

$attrs=$product->attributes();

//Insert Products into DB
mysql_query('INSERT INTO productstemp (merchant_id, merchant_name, aw_product_id, merchant_product_id, product_name, description, category_id, merchant_category, aw_deep_link, aw_image_url, search_price, delivery_cost, merchant_image_url, aw_thumb_url, brand_name, delivery_time, display_price, in_stock, merchant_thumb_url, model_number, pre_order, stock_quantity, store_price, valid_from, valid_to, web_offer, merchantimage, cleancompany) VALUES("'.$merchattrs->id.'","'.$merchattrs->name.'","'.$attrs->id.'"," ","'.$product->text->name.'","'.$product->text->desc.'","'.$product->cat->awCatId.'","'.$product->cat->mCat.'","'.$product->uri->awTrack.'","'.$product->uri->awImage.'","'.$product->price->buynow.'","'.$product->price->delivery.'","'.$product->uri->mImage.'","'.$product->uri->awThumb.'","'.$product->brand->brandName.'","'.$product->delTime.'","'.$product->price->buynow.'","'.$attrs->in_stock.'","'.$product->uri->mThumb.'","'.$product->modelNumber.'","'.$attrs->pre_order.'","'.$attrs->stock_quantity.'","'.$product->price->store.'","'.$product->valFrom.'","'.$product->valTo.'","'.$attrs->web_offer.'","'.$merchantinfo->oMerchant->sLogoUrl.'","247electrical" ) ')
or die(mysql_error());     

}
} 

ありがとう

4

1 に答える 1

0

INSERT クエリ自体が問題だとは思いません。結局、200.000回の挿入はmysqlにとってそれほど多くありません。

まず、ファイルの読み取りが遅いと思います。SimpleXML は便利ですが、大きなファイルの場合、膨大なメモリ オーバーヘッドが発生します。PHP のXMLReaderのようなストリーミング XML リーダーについて考えてみてください。

個々のステートメントをmysqlサーバーに送信していますが、これは1つの巨大なステートメントを送信するよりも遅くなります。また、単一の挿入ステートメントをトランザクションでラップする必要があります。10.000 レコードを処理して挿入した後、スクリプトが停止したり、mysql サーバーが停止したりした場合はどうなりますか? 手動作業 (テーブルのクリア、既に処理されたルックアップなど) なしでスクリプトを安全に再開するにはどうすればよいですか。

それとは別に、多くの VALUES を含む 1 つの INSERT ステートメントの方がはるかに高速です。PHPスクリプトがクエリを出力するようにして、最終的に次のようにします。

INSERT INTO table(field_1, field_2, field 3)
VALUES('foo 1', 'bar 1', 'baz 1'),
VALUES('foo 2', 'bar 2', 'baz 2'),
...

そして、そのファイルを次の方法でインポートします。

$ mysql ... credentials options etc ... < output.sql

それでも遅すぎる場合は、ハードウェアを追加購入することも役立つかもしれません。

于 2012-07-12T11:49:32.907 に答える