繁体   English   中英

MySQL优化NOT IN查询如何?

[英]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;

http://sqlfiddle.com/#!2/d94bf/5

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM