[英]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.