當我隔離了這個查詢:使用MySQL「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;
我得到:
+------------+
| 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不會卡在循環中,除非明確使用循環。如果運行時間過長,則可能意味着查詢非常昂貴。您的數據庫中有多少數據可以運行? – deceze 2012-02-06 02:12:05
你有什麼指標在表中? – 2012-02-06 02:17:06
此外,爲了提高性能,請考慮對子查詢使用JOIN,而不要使用IN(...)。例如,看看這個問題的接受答案:http://stackoverflow.com/questions/8713476/join-table-on-itself-performance/8713527 – Umbrella 2012-02-06 04:14:33