2013-04-28 67 views
1

我在想,爲什麼每個產品的更新每個產品需要10s! 即使沒有更新任何東西,只需按下「保存」按鈕即可。更新性能良好的產品

我發現有上product_save_after 名觀察員是:applyAllRulesOnProduct

所以,即使你不改變價格,它適用於所有的促銷對這款產品! 而且,它不僅更新了所有報價! 後者耗時2秒左右,每次更新完成4次! 下面是該查詢:

UPDATE `sales_flat_quote` AS `t1` 
INNER JOIN (SELECT `t2`.`quote_id` AS `entity_id` FROM `sales_flat_quote_item`  AS `t2` 
INNER JOIN `catalogrule_product_price` AS `t3` 
WHERE (t2.product_id = t3.product_id) GROUP BY `quote_id`) AS `t2` ON t1.entity_id  =  t2.entity_id 
SET `t1`.`trigger_recollect` = 1" 

我很奇怪,爲什麼它做這樣的事情,更新所有報價沒有價格的更新? 我稱之爲錯誤。 Magento應檢查哪個字段已更新...

順便說一句,即使我配置了日誌的自動清理,magento永遠不會清空sales_flate_quote表。 所以一個「解決方案」是消除完成超過5天前的所有報價: DELETE FROM sales_flat_quote WHERE的updated_at < DATE_SUB(NOW(),間隔5天)

這大大減少了查詢的持續時間。 0.3s!

現在,我想知道如果你們中的一些人找到了另一種解決方案。 我在考慮拆除觀察者,並每天刷新規則(促銷)。 副作用是價格的更新沒有立即被促銷反映出來。

另一種解決方案是在後臺運行這個。 我已經購買了Magento Embedded ERP,它有一個後臺任務的概念,我將檢查是否可以在ERP任務之上插入這個概念。因此,當我保存產品時,在後臺創建任務以運行「applyAllRulesOnProduct」

請注意,我的數據庫中有30 000種產品,我每天與供應商同步價格。 之前它是每次更新10s,幸運的是,只有少數產品的價格每天都在變化,否則將需要10 * 30000/3600 =超過2天:-)

感謝任何關於製作產品更新時間縮短。

+0

我相信你已經很舊的硬件或服務器裝載有別的東西。因爲我們沒有這麼大的產品節省時間。我相信它大約在1秒或更短。 – Zyava 2013-04-28 20:33:17

+0

我的配置:Bi-Opteron AMD四核2350, 8GB內存, 高清2 x 240 Go SSD Intel 520 .Os:Mandriva 2010.2。你認爲這是一個糟糕的服務器? :-)這是一個完整的SSD專用服務器。緩存已啓用,並且var文件夾位於RAM(會話,緩存等)中!它需要10秒來更新產品,因爲它必須更新報價,並且有很多報價。但是當您僅僅改變描述時,更新舊引號是沒有用的 – Rod 2013-05-28 11:36:37

回答

0

您可以禁用由涉及事件:

$product->setIsMassupdate(true); 
$product->setExcludeUrlRewrite(true);