[英]MySQL optimize a NOT IN query how to?
我在mysql上执行以下查询,但是查询逻辑是正确的,但是问题是因为有超过10,000+个搜寻者电子邮件和24,000+个来宾电子邮件需要花费很长时间才能执行,是否有更好的方法来执行此操作?
SELECT g.email, g.name
FROM guest g
WHERE g.type='guest'
AND g.email NOT IN (SELECT email FROM seeker GROUP BY email)
GROUP BY g.email
尝试这个:
SELECT
g.email, g.name
FROM
guest g
LEFT JOIN
seeker s
ON
s.email = g.email
WHERE
g.type = 'guest'
AND
s.email IS NULL
GROUP BY
g.email;
SELECT DISTINCT g.email, g.name
FROM guest g
WHERE g.type='guest'
AND NOT EXISTS (SELECT 1 FROM seeker s WHERE g.email = s.email)
并确保您在seeker.email,guest.type,guest.email上有一个索引,如果这些列的顶部NOT NULL
,那将非常棒。
首先,对于您的查询,您不需要group by
:
SELECT g.email, g.name
FROM guest g
WHERE g.type = 'guest' AND g.email NOT IN (SELECT email FROM seeker)
GROUP BY g.email
这可能就足够了。 使用seeker(email)
上的索引,以下内容可以优化:
SELECT g.email, g.name
FROM guest g
WHERE g.type = 'guest' AND
not exists (SELECT 1 FROM seeker where seeker.email = g.email)
GROUP BY g.email;
如果您在大多数email
表中都有很多重复项,那么我不建议您采用left join
方法。
您不需要按内部查询分组。 您可以改为添加DISTINCT。
SELECT g.email, g.name
FROM guest g
WHERE g.type='guest'
AND g.email NOT IN (SELECT DISTINCT email FROM seeker)
GROUP BY g.email
即使这将工作
SELECT g.email, g.name
FROM guest g left outer join seeker s on g.email = s.email
WHERE g.type='guest'
AND s.email is null
GROUP BY g.email
您的查询中将有很多字符串比较,如果您在表中特别是对电子邮件进行索引会很有帮助。 导引头。
另外,请避免使用未聚合且在GROUP BY中不存在的SELECT列。 结果是不确定的。
服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的。 此外,通过添加ORDER BY子句不会影响从每个组中选择值。
更多手册 。
SELECT DISTINCT g.email, g.name
FROM guest g
LEFT OUTER seeker s ON s.email = g.email
WHERE g.type='guest' AND s.email IS NULL
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.