2011-05-19 50 views
0

我有一個相當少量數據(25k行)的文章表。該表具有已發佈的列(布爾值),需要根據外部源的數據狀態進行更新。來自不同表格的MySQL更新狀態

首先我在所有文章中設置published = 0。然後,我將訂閱源數據加載到只包含文章ID和發佈= 1的臨時表中。我想將發佈狀態重新設置爲臨時表中具有ID的所有文章中的一個(臨時表只包含已發佈的文章 - 默認情況下,如果它不在Feed中,則需要取消發佈)。

現在,我使用這個:

UPDATE articles a 
LEFT JOIN data_temp b 
ON a.id = b.id 
SET a.published = 1 
WHERE b.id IS NOT null 

這工作,但它確實慢((如200)秒的慢我的開發服務器上)。看起來好像有一種方法可以很快做到這一點。感謝幫助。

+1

你爲什麼要使用LEFT JOIN?此外,臨時表是否包含任何已發佈= 0? – Jai 2011-05-19 21:52:29

+0

該查詢與相關問題的描述不太一致。 – 2011-05-19 21:54:13

+0

@ Jai--只有發表的文章纔會出現在臨時表中。 @ steve--不確定你的意思。 – julio 2011-05-19 22:08:31

回答

2

你在兩張表的兩個ID列上有索引嗎?如果沒有,這可能會加快加入公平的一點。

+0

哇 - 你在actionshrimp上死了。應該考慮到我猜測,但是當添加索引時,它幾乎是瞬間的。謝謝您的幫助! – julio 2011-05-19 21:53:54

+0

@ julio請將答案標記爲已接受,如果它解決了您的問題 – Cez 2011-05-19 22:00:22

+0

@ cez--只要十分鐘後,系統就會讓我! – julio 2011-05-19 22:02:02

0
UPDATE articles SET published = 1 WHERE id IN (SELECT id FROM data_temp) 

由於緩存的子查詢的結果,它應該是相當快......