首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >改进查询

改进查询
EN

Stack Overflow用户
提问于 2013-05-10 03:56:38
回答 4查看 92关注 0票数 3

我正在尝试执行一个简单的sql查询:

代码语言:javascript
复制
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已编制索引,但不是此表中的主键;它是外键。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-10 04:02:01

这里有一个你的查询的替代方案,尽管根据Quassnoi here (MySQL)的说法,它应该执行类似的操作。

代码语言:javascript
复制
   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 ServerOraclePostgreSQL

票数 1
EN

Stack Overflow用户

发布于 2013-05-10 04:03:42

对于这种类型的查询,有一种已知的模式:获取与另一个集合不匹配的所有行。

代码语言:javascript
复制
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作为覆盖列。

票数 2
EN

Stack Overflow用户

发布于 2013-05-10 04:11:23

代码语言:javascript
复制
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 id
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16470055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档