【发布时间】:2014-03-20 14:53:04
【问题描述】:
我有一个 CSV 文件,其中包含需要添加或更新的产品(如果存在)并保留旧产品,即使它已从列表中删除。
我有一个这样的循环:
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE)
效果很好,我从中分配了几个这样的变量:
$price = htmlspecialchars(mysql_real_escape_string($data[2]), ENT_QUOTES, 'utf-8' );
在我设置了我需要的 4 个变量之后,我像这样查询 MySQL:
mysql_query("SELECT * FROM products WHERE productid = '$prodid' AND supplier = 'SUPPLIER1'")
如果结果为 1 或更多,我们只需更新它
mysql_query("UPDATE tuotteet SET
supplier = 'SUPPLIER1',
product = '$product',
prodid = '$prodid',
ean = '$ean',
price = '$price' WHERE prodid= '$prodid' AND supplier = 'SUPPLIER1'") or die(mysql_error());
如果从数据库中找不到产品,我们会进行另一个查询 INSERT。问题是这是一种非常缓慢的方法,需要花费很多分钟才能完成大约 10000 条产品线。
这有什么关系吗?
【问题讨论】:
-
您可以尝试预先缓存您知道的数据,然后使用 PHP 从预先缓存的数据中进行比较,并在需要时使用批量查询进行更新。
-
为什么不使用
INSERT.... ON DUPLICATE KEY....而不是 SELECT 后跟 INSERT 或 UPDATE?