我正在寻找一种方法来优化我拥有的一个 SQL 查询。我正在尝试获取某种类型的诗歌数量。
查询看起来像这样:
SELECT
COUNT(*)
FROM
`poems`
WHERE `id` IN (
SELECT `poem_id`
FROM `poems_genres`
WHERE `genre_title` = 'derision'
)
AND `status` = 'finished';
它花费的时间太长(大约 6-10 秒),因为它不能使用索引(我想是因为 IN()?)。有没有办法以不同的方式重写此查询以更快地获得相同的结果?
最佳答案
MySQL has a problem在 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';
如果不是,则根据 this article (请参阅“如何强制首先执行内部查询”部分)将其包装在派生表中可能会有所帮助。
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';
关于sql - 嵌套 SQL 查询耗时过长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3987856/