2013-01-11 36 views
1

對於一個大表(1萬條記錄)我有一個這樣的更新查詢:爲MySQL慢查詢使用「IN」

update direct_words set weight = (weight/4) where knowledge_id = :a 
and phrase_id in (select phrase_id from phrases where knowledge_id =:b 
and phrase_class <> 6); 

我有幾個指標,但一個是對於字段:

knowledge_id;phrase_id 

這在SQLite(2秒或更少)下運行速度非常快,但對於MySQL相同的查詢需要大約37秒。我究竟做錯了什麼?

+1

學習使用'JOIN'和'EXPLAIN'。 (前者是因爲它適合RA的概念,而且不必依靠查詢計劃器來解開它,後者因爲它通常會指示計劃的哪些部分成本最高。) – 2013-01-11 09:22:26

+2

JOIN是要走的路。 – bonCodigo

+0

也許'direct_words'表的'knowledge_id,weight'索引可能有幫助? –

回答

7

嘗試execututing它使用JOIN

update direct_words a 
     INNER JOIN phrases b 
      ON a.phrase_id = b.phrase_id 
set  a.weight = (a.weight/4) 
where a.knowledge_id = :a AND 
     b.knowledge_id = :b AND 
     b.phrase_class <> 6 
+2

+1那個速度:D – bonCodigo

+0

@bonCodigo不是真的。 ':D' –

+1

謝謝!剛剛嘗試過,37s變成了0.8s。 –