我需要通过 CSV 文件每天 3 次更新我的 MySQL 数据库中的库存水平。
CSV 中有超过 27,000 种产品需要更新,您可以想象这需要一点时间。
我目前有一个运行以下命令的 php 脚本:
select * from products where product_code = "xxxxxxx";
if num_rows > 0
if new_stock_level = 0
UPDATE products SET `stock` = 0, `price` = 9.99 where product_code = "xxxxxxx";
else
UPDATE products SET `stock` = 50, `price` = 9.99, `stock_date` = now() where product_code = "xxxxxxx";
如果您要更新 < 50 个项目而不是 27,000 个,这一切都很好!
更新这种规模的最佳方式是什么?
我一直在做一些研究,据我所知,mysqli 准备好的陈述似乎是我应该去的地方。
在尝试了下面提到的一些位和我在网上阅读的内容之后,我得到了以下结果,有 250 个更新。
平均而言,从 InnoDB 更改为 MyISAM 后,每秒更新的次数从 7 次增加到 27 次,这是一个巨大的开始。
用 case 9-10 秒准备语句
## Prepare the statment.
$stmt = $mysqli->prepare("UPDATE products SET stock = case ? when 0 then 0 else ? end, price = ?, stock_date = case ? when 0 then stock_date else now() end WHERE product_code = ?");
$stmt->bind_param('dddds', $stock, $stock, $price, $stock, $prod);
$stmt->execute();
非准备陈述 9-10 秒
$sql = "UPDATE products SET stock = case " . $stock . " when 0 then 0 else " . $stock . " end, price = " . $price . ", stock_date = case " . $stock . " when 0 then stock_date else now() end WHERE product_code = \"" . $prod . "\";\n";
$mysqli->query($sql);
在 50 秒内对语句进行分组并使用 multi_query 执行 9-10 秒
$mysqli->multi_query($sql);
未准备好 2 个单独的查询,具体取决于我是否更新库存日期。 8-9 秒
if($stock > 0)
{
$sql = "UPDATE products SET stock = " . $stock . ", price = " . $price . ", stock_date = now() WHERE product_code = \"" . $prod . "\";\n";
}
else
{
$sql = "UPDATE products SET stock = " . $stock . ", price = " . $price . " WHERE product_code = \"" . $prod . "\";\n";
}
$mysqli->query($sql);
相同的 8-9 秒的准备版本
## Prepare statments
$stmt1 = $mysqli->prepare("UPDATE products SET stock = ?, price = ?, stock_date = now() WHERE product_code = ?;");
$stmt1->bind_param('dds',$stock, $price, $prod);
$stmt2 = $mysqli->prepare("UPDATE products SET stock = ?, price = ? WHERE product_code = ?;");
$stmt2->bind_param('dds', $stock, $price, $prod);
if($stock > 0)
{
$stmt1->execute();
}
else
{
$stmt2->execute();
}
我还尝试向 VPS 添加一个额外的处理器,它使大约 4 个查询速度提高了一秒。
最佳答案
您可以使用 MySQL 的 CSV storage engine制作一个直接访问您的 CSV 文件的表格。无需导入。
然后你可以使用multi-table UPDATE syntax使用 product_code
列将 CSV 表直接连接到您的 products
表。然后,您可以根据从 CSV 表中读取的列更新 products
的列。
关于php - 大规模更新 MySQL 的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16992433/