繁体   English   中英

SQL不喜欢的地方

[英]SQL where not in LIKE

我在一个表中有一个电子邮件地址列表,在另一个表中有一个域列表。 我只想从电子邮件表中查询电子邮件,前提是他们的电子邮件在域表中没有设置域。

email                               domains
------                              -------

a@google.com                       yahoo.com
a@yahoo.com                        ebay.com
a@ebay.com
a@gmail.com

因此,只有a@google.com和a@gmail.com应该是查询的结果。

我遇到的问题是我的电子邮件表中大约有600万行,即使具有正确的索引,查询也要花费相当长的时间。 有没有更好的方法来解决这个问题? 我也觉得使用concat并没有帮助,因为当您使用某个函数时,它不再使用索引了吗?

这是我的查询:

SELECT
 email
FROM
    emails
    LEFT JOIN `domains` ON emails.email LIKE CONCAT( '%', domains.domain, '%' ) 
WHERE
    AND `domains`.`domain` IS NULL

我将使用这样的子查询:

select e.*
from email e
where not exists (select 1
                  from domains d
                  where e.email like concat('%', d.domain)
                 );

但是,使用此版本可能会获得更好的性能:

select e.*
from email e
where not exists (select 1
                  from domains d
                  where substring_index(e.email, '@', -1) = d.domain
                 );

相等性使得可以在domains(domain)上使用索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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