Ste*_*lor 3 php mysql csv mysqli
我需要每天从CSV文件中更新MySQL数据库中的库存水平3次.
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";
Run Code Online (Sandbox Code Playgroud)
如果您要更新<50项而不是27,000项,这一切都很好!
更新此规模的最佳方法是什么?
我一直在做一些研究,从我所看到的mysqli准备好的陈述似乎是我应该去的地方.
在尝试了下面提到的一些内容以及我在线阅读的内容之后,我已经获得了一批250次更新的结果.
从InnoDB更改为MyISAM平均每秒的ubdate数量从7增加到27,这是一个巨大的增长.
案例准备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();
Run Code Online (Sandbox Code Playgroud)
未准备好的声明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);
Run Code Online (Sandbox Code Playgroud)
将命令分组为50秒,并以multi_query 9-10秒进行分配
$mysqli->multi_query($sql);
Run Code Online (Sandbox Code Playgroud)
如果我更新股票日期,则不准备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);
Run Code Online (Sandbox Code Playgroud)
准备版本相同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();
}
Run Code Online (Sandbox Code Playgroud)
我也尝试在VPS上添加一个额外的处理器,它使得它的速度提高了大约4个查询.
您可以使用MySQL的CSV存储引擎创建一个直接访问CSV文件的表.无需导入它.
然后,您可以使用多表UPDATE语法products使用该product_code列将CSV表直接连接到表.然后,您可以products根据从CSV表中读取的列更新列.