簡體   English   中英

加速使用存在的SQL查詢

[英]Speeding up a sql query that uses exists

我是SQL的新手,終於設法完成了一個查詢,該查詢返回了我要查找的值! 唯一的問題是,這實際上運行很慢,可能是因為存在條件子句。 我希望添加LIMIT可以大大加快速度,但是不幸的是,我憑經驗發現這不是事實。

還有另一種方式編寫此查詢以“可接受的”速度返回相同值的查詢嗎? 我意識到“可以接受”是主觀的,但是我只是在尋找新的方法。

以下是使用的表:

content
---------------------------------------
id            |    Int
---------------------------------------

content_revision
---------------------------------------
id            |    Int
content_id    |    ForeignKey (content)
---------------------------------------

這是我的慢查詢:

SELECT outer_content.id AS "TEN_MOST_RECENT_CONTENTS_WITH_ONE_REVISION" 
    FROM content outer_content 
    JOIN content_revision ON outer_content.id = content_revision.content_id 
    WHERE EXISTS (
        SELECT inner_content.id 
            FROM content_revision 
            JOIN content inner_content ON content_revision.content_id = inner_content.id 
            WHERE outer_content.id = inner_content.id 
            GROUP BY inner_content.id HAVING count(*) = 1
    ) 
ORDER BY ts_created DESC 
LIMIT 10;

我有興趣尋找“ TEN_MOST_RECENT_CONTENTS_WITH_ONE_REVISION”

您真的需要內部選擇嗎? 您可以使用:

 SELECT inner_content.id, MAX(ts_created) 
            FROM content_revision 
            JOIN content inner_content ON content_revision.content_id = inner_content.id 
            GROUP BY inner_content.id HAVING count(*) = 1
            ORDER BY MAX(ts_created) DESC 
            LIMIT 10;

由於您使用的是分組依據,因此,如果ts_created ,可以使用MAX(ts_created) 這里只有一條記錄無論如何,因為的HAVING

您根本不需要使用WHERE EXISTS條件。 您要做的就是GROUP BY content.id, content.ts_created並添加HAVING count(content_revision.*) = 1 ,然后進行限制,排序等。

-- get ten most recent contents with one revision
SELECT content.id, content.ts_created 
FROM content
JOIN content_revision ON content.id = content_revision.content_id 
GROUP BY content.id, content.ts_created 
HAVING count(content_revision.*) = 1
ORDER BY content.ts_created DESC 
LIMIT 10;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM