嵌套SQL查询需要太长时间

Sil*_*ght 3 mysql sql query-optimization

我正在寻找一种优化我所拥有的SQL查询的方法.我正在努力获得一定数量的诗歌.

查询看起来像这样:

SELECT
    COUNT(*)  
FROM
    `poems`
WHERE `id` IN (    
                  SELECT `poem_id`
                  FROM `poems_genres`  
                  WHERE `genre_title` = 'derision'
              )
       AND `status` = 'finished';
Run Code Online (Sandbox Code Playgroud)

它需要太长时间(大约6-10秒),因为它不能使用索引(因为我认为IN()?).有没有办法以不同的方式重写此查询以更快地获得相同的结果?

Mar*_*ith 11

MySQL 有一个问题,in即它反复重新评估不相关的子查询,就像它们是相关的一样.重写作为联接改进了吗?

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';
Run Code Online (Sandbox Code Playgroud)

如果没有,那么根据本文(参见"如何强制内部查询首先执行"一节)将它包装在派生表中可能会有所帮助.

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';
Run Code Online (Sandbox Code Playgroud)