sql - 嵌套 SQL 查询耗时过长

标签 sql mysql query-optimization

我正在寻找一种方法来优化我拥有的一个 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 problemin 中,它反复重新评估不相关的子查询,就好像它们是相关的一样。将重写作为连接会有所改善吗?

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/

相关文章:

sql - sqoop如何在将数据导入到hive时自动从db2中修剪一些字符类型列?

sql - 在 Postgresql 中按一级取消嵌套多维数组

mysql - sql.DB.Query "expected 0 arguments"使用 "?"占位符时

c# - 在 .NET 中将多个非 SELECT MySQL 语句作为单个命令文本执行

performance - UNION ALL 耗时太长

mysql - 地理空间数据的表结构

c# - SQLite,在我的表中插入变量(c# 控制台应用程序)

MySQL IPv4 验证实现

php - 最小化来自 webhook 回调的 MYSQL 连接

sql - 是否可以使用 SELECT 语句分部分获取数据库记录?