0

Magento の製品価格/在庫更新スクリプトを作成しました。csv を配列にロードし、それを反復処理します。現在のコードは、5,000 個の製品を完了するのに約 10 分かかります。これを行うより速い方法はありますか? Magento の API は非常に遅く、テーブルが少なく、高速であるため、データベースを直接更新するように切り替えたため、既にバイパスしました。タイマーを使用して時間を記録すると、foreach ループに約 10 分、reindexALL に 2 分かかります。

$con = mysql_connect("localhost","root","");
$selected = mysql_select_db("magento",$con);

$processes = Mage::getSingleton('index/indexer')->getProcessesCollection();
$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_MANUAL));
$processes->walk('save');

foreach($all_rows as $final)
{

$sql = mysql_query("SELECT entity_id from catalog_product_entity where sku = '".$final[ITEM]."'");

if ($row = mysql_fetch_array($sql)) {

//update price
$pricenew = $final['PRICE'] + ($final['PRICE']*.30);
mysql_query("UPDATE catalog_product_entity_decimal SET value = '$pricenew' where attribute_id = 75 AND entity_id = '".$row[entity_id]."' ");

//update retail price
$retailprice = $final['RETAIL'];
mysql_query("UPDATE catalog_product_entity_decimal SET value = '$retailprice' where attribute_id = 120 AND entity_id = '".$row[entity_id]."' ");

//update stock quantity and is in stock
$stockquantity = $final['QTY'];
$stockquantity = number_format($stockquantity, 4, '.', '');
mysql_query("UPDATE cataloginventory_stock_item SET qty = '$stockquantity', SET is_in_stock = 1 where product_id = '".$row[entity_id]."' ");

}

$processes->walk('reindexAll');
$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_REAL_TIME));
$processes->walk('save');

mysql_close($con);
4

1 に答える 1

1

テーブルcatalog_product_entity_decimalにインデックスがあり、それがidをカバーしている場合(明らかにそうです)、それを高速化する他の方法はありません。ここで最も遅いのは、値の物理的な変化です。WHEREおそらく、価格を同じ値に更新しないように句を入れることができます。

その他の考え: ほとんどの人はステートメントのパフォーマンスの最適化に目を向けますSELECTUPDATEDELETEステートメントは見落とされることがよくあります。これらは、クエリ実行計画(QEP)を分析する原則から恩恵を受けることができます。ステートメントに対してのみ実行できますがEXPLAIN、ステートメントのように実行するようにorステートメントをSELECT書き直すことは可能です。UPDATEDELETESELECT

を最適化するには、節UPDATEを見てください。WHEREを使用している場合はPRIMARY KEY、これ以上の分析は必要ありません。そうでない場合は、UPDATEステートメントをステートメントとして書き直し、前述のようにSELECTを取得して、QEP最適なインデックスが使用されるようにすることをお勧めします。例えば:

UPDATE t
SET c1 = ‘x’, c2 = ‘y’, c3 = 100
WHERE c1 = ‘x’
AND d = CURDATE()

このUPDATEステートメントを次のSELECTように書き換えることができますEXPLAIN

EXPLAIN SELECT c1, c2, c3 FROM  t WHERE c1 = ‘x’ AND    d = CURDATE()

SELECTステートメントを最適化するときと同じ原則を適用する必要があります。

于 2012-09-24T07:59:59.703 に答える