我正在尝试执行一个简单的sql查询:
SELECT DISTINCT id
FROM marketing
WHERE type = 'email'
AND id NOT IN (
SELECT id
FROM marketing
WHERE type = 'letter'
)
ORDER BY id;它需要很长时间才能运行,我认为这与where语句中的select有关(有大量的ids),但我想不出一种方法来改进它。
首先,这是查询如此缓慢的原因吗?其次,有什么建议可以改进它吗?
编辑:
数据库系统: MySql
Id已编制索引,但不是此表中的主键;它是外键。
发布于 2013-05-10 04:02:01
这里有一个你的查询的替代方案,尽管根据Quassnoi here (MySQL)的说法,它应该执行类似的操作。
select email.id
from marketing email
left join marketing letter on letter.type='letter' and letter.id=email.id
where email.type='email' and letter.id is null
group by email.id
order by email.id;编写此类查询的三种主要方法是NOT IN、NOT EXISTS (相关)或LEFT JOIN/IS NULL。Quassnoi比较了MySQL (上面的链接)、SQL Server、Oracle和PostgreSQL。
发布于 2013-05-10 04:03:42
对于这种类型的查询,有一种已知的模式:获取与另一个集合不匹配的所有行。
select id from marketing m1
left outer join marketing m2 on m1.id = m2.id and m2.type = 'letter'
where m1.type = 'email' and m2.id IS NULL这将获取营销中类型为'email‘的所有行,并且不存在类型为'letter’的要匹配的id。如果需要另一个集合,请使用IS NOT NULL。为了获得最大的执行速度,您只需要在id列上建立适当的索引,并将type作为覆盖列。
发布于 2013-05-10 04:11:23
select distinct id
from marketing a
where type = 'email'
and not exists (
select 'X'
from marketing b
where a.id = b.id
and type = 'letter' )
order by idhttps://stackoverflow.com/questions/16470055
复制相似问题