我很难通过与php / Mysql中的另一个表进行比较来更新一列表。我试图通过索引表列,优化查询等但无法加快进程来加快进程。
在我的基于php的应用程序中有两个表(表A和表B),我想通过与表B(具有两个列 - 名称& sku)进行比较来更新表A的一列。
以前上述过程最多需要15分钟才能更新28k产品。但现在两个表(表A和表B)都有60k行。现在它花了两个多小时。我使用了以下查询
mysql_query("UPDATE tableA a
JOIN tableB b ON a.product_code_sku = b.sku
SET a.is_existing_product = '1'") or die(mysql_error());
mysql_query("UPDATE tableA a
JOIN tableB b ON a.product_name = b.product_name
SET a.is_existing_product = '1'") or die(mysql_error());
上面的查询非常慢,之后我更改了下面的更新过程
$query_result = mysql_query("SELECT t1.`id`,t2.`product_id` FROM `tableA` t1,
`tableB` t2 where (t1.product_code_sku = t2.sku
or t1.product_name = t2.product_name)") or die (mysql_error());
while($result_row = mysql_fetch_array($query_result))
{
mysql_query("UPDATE `tableA` SET is_existing_product = '1'
where id = '".$result_row['id']."' ") or die (mysql_error());
}
但我所有的努力都是徒劳的。
请告诉我如何加快处理速度。
答案 0 :(得分:3)
您的第一个更新查询和第二个更新查询正在执行两个不同的操作。第二个查询较慢,因为您使用OR进行比较。
您可以考虑创建一个临时表来进行比较和插入,将更新返回到tableA。
首先,您应该检查两个连接查询的执行情况,例如
desc select a.id
from tableA a
join tableB b ON a.product_code_sku = b.sku;
如果这是更新速度缓慢的原因,则应优化查询。 否则,您可以尝试以下方法:
例如(假设ID为主键),
// make sure the columns are in the same data type
create table tmp_sku (
id .. // just the primary key, make sure is using the same data type as in tableA
);
// do a insert into this temporary table
insert into tmp_sku select a.id
from tableA a
join tableB b ON a.product_code_sku = b.sku;
// now we have list of matches,
// then do a insert .. duplicate key update
// by comparing the primary id
insert into tableA (id, is_existing_product)
select tmp_sku.id, 1 from tmp_sku
on duplicate key set is_existing_product = 1;
// repeat for the product name
truncate tmp_sku;
insert into tmp_sku
select a.id
from tableA a
join tableB b ON a.product_name = b.product_name;
// repeat the duplicate .. update
insert into tableA (id, is_existing_product)
select tmp_sku.id, 1 from tmp_sku
on duplicate key set is_existing_product = 1;