【发布时间】:2012-02-06 02:05:21
【问题描述】:
当我隔离这个查询时:
SELECT `Tagged`.`contact_id`
FROM contacts_tags AS Tagged LEFT JOIN tags AS Tag ON (`Tagged`.`tag_id` = `Tag`.`id`)
WHERE `Tag`.`id` = 137;
我明白了:
+------------+
| contact_id |
+------------+
| 3519 |
| 17080 |
+------------+
但是当我使用“IN”将它与更大的查询结合起来时,我会得到某种递归循环,并且我的数据库开始消耗处理能力,直到超时。
SELECT `Contact`.*
FROM `contacts` AS `Contact`
WHERE `Contact`.`id` in
(SELECT `Tagged`.`contact_id`
FROM contacts_tags AS Tagged LEFT JOIN tags AS Tag ON (`Tagged`.`tag_id` = `Tag`.`id`)
WHERE `Tag`.`id` = 137 );
这会一直运行,直到我重置服务器。
但是当我手动列出第一个查询响应时它可以工作:
SELECT `Contact`.*
FROM `contacts` AS `Contact`
WHERE `Contact`.`id` in
(3519, 17080);
有什么区别?
【问题讨论】:
-
SQL 不会陷入循环,除非您明确使用循环。如果运行时间过长,则可能意味着查询非常昂贵。您的数据库中有多少数据可以运行它?
-
表中有哪些索引?
-
另外,为了提高性能,请考虑对子查询使用 JOIN,而不是 IN (...)。例如,查看此问题的已接受答案:stackoverflow.com/questions/8713476/…
标签: mysql cakephp loops has-and-belongs-to-many