Mysql根据另一个表更新一个表列大量数据

时间:2014-09-22 10:40:41

标签: php mysql performance sql-update query-optimization

我很难通过与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());  
}

但我所有的努力都是徒劳的。

请告诉我如何加快处理速度。

1 个答案:

答案 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;