2014-09-22 135 views
1

我堅持通過與php/Mysql中的另一個表進行比較來更新表的一列。我試圖通過索引表列來加速這個過程,優化查詢等,但無法加快過程。Mysql基於另一個表更新一個表列大量的數據

在我的基於php的應用程序中有兩個表(表A和表B),我想通過與表B比較來更新表A的一列(帶有兩列 - 名稱爲& SKU)。

以前的上述過程已花費最多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()); 
} 

但是我所有的努力都白費了。

請指教我如何使過程更快。

回答

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; 
+0

非常感謝您的寶貴答案。我會在測試後確認你,並且查詢將是「重複密鑰更新」而不是「重複密鑰集」對嗎? – 2014-09-22 11:34:34

+0

SUPERB ....你的代碼就像一個魅力......現在這個過程只需要6個小時......感謝很多人...... – 2014-09-22 12:06:37

相關問題