我为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);
答案 0 :(得分:1)
如果你的表catalog_product_entity_decimal
有索引,那就是id(显然是) - 那么你就没有办法加快速度了。因为这里最慢的是物理上的价值变化。
可能您可以放置一个WHERE
子句,以避免将价格更新为相同的值。
其他想法:
虽然大多数人都会考虑SELECT
语句的效果优化,但UPDATE
和DELETE
语句经常被忽略。这些可以从分析查询执行计划(QEP)的原则中受益。您只能在EXPLAIN
语句上运行SELECT
,但是可以重写UPDATE
或DELETE
语句来执行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
的{{1}}声明:
EXPLAIN
您现在应该应用与优化EXPLAIN SELECT c1, c2, c3 FROM t WHERE c1 = ‘x’ AND d = CURDATE()
语句时相同的原则。