加快MySQL PHP查询速度

时间:2014-03-20 14:53:04

标签: php mysql

我有一个产品的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条产品线。

与此有什么关系?

3 个答案:

答案 0 :(得分:1)

在开始这个过程之前,我会在数据库中查询数据库中的所有product_id,然后我会将它们存储在字典中。
然后,开始处理csv文件。 对于每条记录,只要询问字典是否有当前product_id的密钥。

这样做可以避免为csv中的每条记录转到数据库。

答案 1 :(得分:0)

我有类似的问题。最好的解决方案是构建单个查询。这是Python中的代码:

# data to updload in a dictionary {id, new_value}
dict = {2:1001,4:251}

ids = [] 
sql = "UPDATE tabla1 SET value = CASE id "    

for key in dict:
    sql = sql + 'WHEN '+str(key)+' THEN '+str(dict[key])+ '\n\t'
    ids.append(key)
ids_string = ', '.join(map(str, ids))
sql = sql + "END WHERE id IN ("+ids_string+")"
print sql

答案 2 :(得分:0)

它会更快,更高效,并且需要更少的代码才能使用LOAD DATA

LOAD DATA LOCAL INFILE 'myinput.csv'
 REPLACE INTO TABLE tuotteet

您只需要确保在列(prodid, supplier)上定义了PRIMARY KEY或UNIQUE KEY。 LOAD DATA将使用它来判断该行是否已存在且需要更新,或者该行是否不存在且需要作为新行插入。

然后你不需要使用fgetcsv(),你不需要进行任何转义,你不需要SELECT或UPDATE或INSERT,它应该运行大约10倍。