2013-07-11 133 views
1

我試圖更新使用連接基於另一個表的字段的字段:加快更新速度慢查詢

UPDATE transactions 
JOIN products ON products.link = transactions.product_id 
SET transactions.user_id = products.user_id 
WHERE transactions.user_id != products.user_id 

然而,這走的是一條很長的時間(超過15分鐘)。產品有10K行,交易約有90K行。無論如何,我可以優化我的查詢?

交易表:

id    int(11) 
transaction_id varchar(255) 
user_id   int(11) 
product_id  varchar(50) 

產品表:

id  int(11) 
user_id int(11) 
link varchar(45) 
+0

加入兩個不同大小的varchar字段需要每次更新的完整表掃描。沒有其他方式來加入表格嗎? –

+0

@DavidColwell很遺憾,沒有其他方法可以加入。我擔心這可能與此有關。我可以並將在未來更改連接字段以使用INT。但我需要先執行此更新。查詢本身是否正確? – Abs

+0

我不會重複這些結果,但嘗試@ Mari的方法...可能會有所幫助... 將來,請用這種方式來看待它。如果事務已經有一個用戶ID,並且一個事務有一個產品,那麼產品不需要一個用戶ID(除非產品有一個用戶ID,因爲它最初是創建產品的用戶) –

回答

1

我不確定這個sql是否有幫助。你能試一下嗎?

update transactions as T1 
inner join (select T2.id , P.user_id 
       from transactions as T2, projects as P 
       where T2.product_id = P.link 
       and T2.user_id != P.user_id 
      ) as T3 on T1.id = T3.id 
set T1.user_id = t3.user_id 
+0

我測試了這個uisng的'SELECT',它似乎返回了正確的行數,但它需要很長時間。還要將'projects'改成'products'。我認爲由於我的桌子設計,所有查詢都會很慢。 – Abs

+0

我很快就忽略了這一點。我再次測試了您的查詢,並在5分鐘內運行!我已將此更改爲正確的答案。但我仍然會執行戴維斯的建議。 – Abs

+0

我很高興它幫助:) –

0

請試試這個,而不是不等於你可以用LEFT OUTER一招JOIN

UPDATE transactions 
LEFT OUTER JOIN products ON products.link = transactions.product_id AND 
transactions.user_id = products.user_id 
SET transactions.user_id = products.user_id 
WHERE products.user_id IS NULL AND transactions.product_id IS NULL 
+0

此查詢和我的不一樣。它返回一個空的結果,如果你只是執行一個選擇。 – Abs

+0

你現在可以試試我編輯的答案@Abs .. – Mari

+0

我試過了最新版本,並將它變成select返回0結果。它應該返回約1K行。版本2的查詢返回結果,但我需要將其與我的原始查詢進行比較。 – Abs

1

有我在這裏看到兩個問題

  1. Products表和Transactions表通過不同大小的Varchar字段鏈接。這會強制查詢優化器同時對錶進行掃描(假設兩者都沒有索引)
  2. 產品表和事務表都具有user_id。這些ID可以不同嗎?如果沒有,也許這就是數據重複

爲了使您的查詢速度更快:

  1. 鏈接標識列的表(即交易表中包含一列名爲PRODUCT_ID INT(11)引用在產品表ID列。這將允許你這樣做非常快加入
+0

我會選擇這個作爲正確的答案,以加快這個查詢和未來的查詢,我需要糾正我的表格設計。 – Abs

+0

無論哪種方式,對於100,000行以下的表格,我希望在幾秒鐘內(最多10個左右)的結果作爲指導 –

0

創建兩個指標,一個是關於products.link和其他的transactions.product_id。

並考慮將user_id添加爲每個索引中的包含字段(如果在mysql中支持該字段;我主要是做SQL Server編程)。

+0

或許考慮在產品表上創建唯一索引。如果在product_link字段中有重複的話,這將完全影響整個過程 –