以下delete语句导致mysql卡住:
DELETE FROM domains WHERE id IN (SELECT domain_id FROM domains_groups WHERE group_id = 9);
虽然这个语句也是这样做的,但它的作用是:
DELETE FROM domains WHERE id IN (select id from (SELECT domain_id as id FROM domains_groups WHERE group_id = 9) a);
有人能解释原因吗?
发布于 2014-12-17 13:34:07
原因与SQL查询的优化有关。您的第一个版本是计算每一行的子查询--尽管在最近版本的MySQL中已经修正了这一点。第二个版本是创建一个临时表,因此速度要快得多。
我建议使用exists或join
DELETE d FROM domains d
WHERE EXISTS (SELECT 1 FROM domains_groups dg WHERE dg.group_id = 9 AND dg.domain_id = d.id);或者:
DELETE d
FROM domains d JOIN
domaings_groups dg
ON dg.group_id = 9 AND dg.domain_id = d.id;我还将推荐一个索引,即domain_groups(domain_id, group_id) (针对上述两个版本)或domain_groups(group_id, domain_id) (用于in版本)。
https://stackoverflow.com/questions/27524000
复制相似问题