首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套SQL查询花费的时间太长

嵌套SQL查询花费的时间太长
EN

Stack Overflow用户
提问于 2010-10-21 21:21:36
回答 2查看 1.6K关注 0票数 3

我正在寻找一种方法来优化我拥有的一个SQL查询。我想知道有多少首诗属于某一流派。

查询如下所示:

代码语言:javascript
复制
SELECT
    COUNT(*)  
FROM
    `poems`
WHERE `id` IN (    
                  SELECT `poem_id`
                  FROM `poems_genres`  
                  WHERE `genre_title` = 'derision'
              )
       AND `status` = 'finished';

它花费的时间太长(大约6-10秒),因为它不能使用索引(我想是因为IN()?)。有没有办法以不同的方式重写这个查询,以更快地获得相同的结果?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-21 21:24:38

使用in的MySQL has a problem,它反复重新评估不相关的子查询,就好像它们是相关的一样。作为连接的重写能改善事情吗?

代码语言:javascript
复制
SELECT
    COUNT(distinct p.`id`)  
FROM `poems` p
JOIN `poems_genres` pg
ON  p.`id` = pg.`poem_id`  
WHERE pg.`genre_title` = 'derision' AND p.`status` = 'finished';

如果不是这样,那么根据this article (请参阅“如何强制内部查询首先执行”一节),将其包装在派生表中可能会有所帮助。

代码语言:javascript
复制
SELECT
    COUNT(*)  
FROM
    `poems`
WHERE `id` IN
(
 select  `poem_id` from ( SELECT `poem_id`
                  FROM `poems_genres`  
                  WHERE `genre_title` = 'derision') x

) AND `status` = 'finished';
票数 11
EN

Stack Overflow用户

发布于 2010-10-21 22:12:32

还可以使用EXISTS子句并对id和poem_id字段进行关联

代码语言:javascript
复制
SELECT
    COUNT(*)  
FROM
    `poems` p1
WHERE EXISTS
(
 SELECT `poem_id`
                  FROM `poems_genres`  pg
                  WHERE `genre_title` = 'derision'  and p1.id = pg.poem_id

) AND `status` = 'finished';

与IN的不同之处在于,它将尝试使用索引,而不是执行全表扫描。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3987856

复制
相关文章

相似问题

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