2010-07-26 50 views
1

我试图执行以下查询MySQL的子查询曹景伟服务器挂起

SELECT * FROM person 
     WHERE id IN 
      (SELECT user_id FROM participation 
        WHERE activity_id = '1' AND application_id = '1' 
      ) 

外部查询返回,而内部回报29.约4000应答当我的Web服务器没有执行发生了,当我测试它在本地mysql结束了使用100%的CPU,并且什么都没有实现。规模可能是原因吗?

具体来说,它会导致服务器永久挂起,我相当确信我运行查询的Web服务器正在崩溃的过程中,因为它(woops)。

+0

它挂了多久?几秒钟,几分钟,永远? – 2010-07-26 12:23:08

+0

将索引放在表'person'的'id'和'参与'表'的user_id'中 – Salil 2010-07-26 12:26:29

+0

我们可以看到表的DDL吗? – Zaki 2010-07-26 12:26:46

回答

2

为什么你不用这个查询使用内部连接?我认为这会更快(并且更容易阅读) - 也许它解决了您的问题(但我无法在您的查询中找到失败)。

编辑:内联接解决方案应该是这样的:

SELECT 
    person.* 
FROM 
    person 
INNER JOIN 
    participation 
ON 
    person.id = participation.user_id 
WHERE 
    participation.activity_id = '1' 
AND 
    participation.application_id = '1' 
+1

子查询是为主查询的每一行执行的,所以JOIN是一个合适且快得多的方法。 – Naktibalda 2010-07-26 13:10:07

+0

@Naktibalda,你确定吗?这不是我对子查询如何工作的理解。我几乎肯定会创建一个临时表,所以它只能执行一次。 – 2010-07-26 13:15:45

+0

谢谢oezi,如果/当服务器再次出现,我会给它一个哈哈。 – Chris 2010-07-26 13:24:09

1

有多少行那里participation表和索引什么在那里? (user_id,activity_id,application_id)上的多列索引可能对此有所帮助。

评论:IN不慢。如果IN中的子查询与外部查询相关,则子查询可能会很慢。