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