2012-09-24 58 views
0

我爲Magento寫了一個產品價格/庫存更新腳本。我將csv加載到數組中,然後遍歷它。目前的代碼需要大約10分鐘才能完成5000個產品,有沒有更快的方法來做到這一點?我已經繞過了Magento的API,因爲這非常慢,並且由於其表格更多而且速度更快,所以直接更新數據庫。使用計時器來記錄時間,大約需要10分鐘,foreach循環和兩分鐘的時間reindexALLPHP最快的方式來遍歷數組並更新mysql?

$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); 
+1

不是你的問題的直接答案,但不要使用'mysql_ *',它開始了棄用過程。看看「PDO」或「mysqli_ *」,而不是 –

+1

你檢查過Mysql的LOAD DATA INFILE嗎? –

+0

雖然產品已經在數據庫中,但我只需要每天從csv更新價格/庫存。價格和庫存也有兩個不同的表格。最好是使用LOAD DATA INFILE嗎? – user1155594

回答

1

如果您的表catalog_product_entity_decimal有指數,覆蓋ID(顯然是) - 那麼你有沒有其他的加速它的方法。由於這裏最慢的事情是價值的物理變化。 也許你可以把WHERE條款,以避免更新價格相同的價值。

其他的想法: 雖然大多數人看的性能優化的SELECT陳述,UPDATEDELETE語句往往被忽視。這些可以受益於分析查詢執行計劃(QEP)的原則。您只能在SELECT語句上運行EXPLAIN,但可以重寫UPDATEDELETE語句,使其像SELECT語句一樣執行。

要優化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報表時,您現在應該採用同樣的原則。