2013-01-11 34 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。 –