gpt4 book ai didi

Php 迭代数组并更新 mysql 的最快方法?

转载 作者:行者123 更新时间:2023-11-29 14:16:34 33 4
gpt4 key购买 nike

我为 Magento 编写了一个产品价格/库存更新脚本。我将 csv 加载到数组中,然后迭代它。当前的代码大约需要 10 分钟才能完成 5,000 个产品,是否有更快的方法来完成此操作?我已经绕过了 Magento 的 API,因为它非常慢,并切换到直接更新数据库,因为它的表不多而且速度更快。使用定时器记录时间,foreach循环大约需要10分钟,reindexALL需要两分钟

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

最佳答案

如果你的表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 语句时相同的原则。

关于Php 迭代数组并更新 mysql 的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12560878/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com