php - 大规模更新 MySQL 的最佳方法?

标签 php mysql csv mysqli

我需要通过 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/

相关文章:

php - MYSQL 日期字段始终输出 0000-00-00

java - 如何使用 Java 删除 Excel (csv) 工作表中的一行?

python - 将 JSON 或 XML 或 CSV 数据添加到 MySQL 服务器

java - 同步不适用于计数器?

php - CREATE 命令被拒绝 - 您能否回答更改任何权限以允许我的 PHP-My-Admin 传递以下 SQL 命令代码?

php - mysql #1067 - 'created_at' 的默认值无效

php - 在数据库中创建页面和条目的表单

javascript - ajax登录表单,重新加载到表单而不是页面

sql - 这个sql查询可以简化吗?

python - 无法使用 Python 的 MySQLdb 连接到 localhost