导致服务器挂起的MySQL子查询

导致服务器挂起的MySQL子查询,mysql,in-subquery,Mysql,In Subquery,我正在尝试执行以下查询 SELECT * FROM person WHERE id IN ( SELECT user_id FROM participation WHERE activity_id = '1' AND application_id = '1' ) 外部查询返回大约4000个响应,而内部查询返回29个响应。当在我的web服务器上执行时,什么都没有发生,当我在本地测

我正在尝试执行以下查询

SELECT * FROM person 
         WHERE id IN 
             ( SELECT user_id FROM participation 
                    WHERE activity_id = '1' AND application_id = '1' 
             )
外部查询返回大约4000个响应,而内部查询返回29个响应。当在我的web服务器上执行时,什么都没有发生,当我在本地测试它时,mysql最终使用了100%的CPU,但仍然一无所获。尺寸可能是原因吗


具体地说,它会导致服务器永久挂起,我很确定我运行查询的web服务器正在崩溃(woops)。

为什么不使用内部联接进行此查询?我认为这会更快(更容易阅读)——也许它解决了你的问题(但我在你的查询中找不到失败)

编辑:内部联接解决方案如下所示:

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

participation
表中有多少行,有哪些索引? 在(用户id、活动id、应用程序id)上的多列索引在这里可能会有所帮助


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

它会挂起多长时间?几秒钟,几分钟,永远?将索引放在表
person
id
和表
participation
user\u id
上,我们能看到表的DDL吗?在slow@Zaki,与在同一查询上可以进行正确连接相比,IN的速度较慢。然而,我不会用笼统的说法说它很慢。当您需要一个不断定义的ID列表的记录时,可以使用它。子查询是为主查询的每一行执行的,因此JOIN是一种正确且速度更快的方法。@Naktibalda,您确定吗?这不是我对子查询如何工作的理解。我几乎肯定会创建一个临时表,所以只执行一次。谢谢oezi,如果服务器再次出现,我会尝试一下。哈哈。不要使用或推荐逗号语法。使用正确的ANSI内部联接格式。