我是新來的SQL,並設法最終將查詢返回我正在查找的值!唯一的問題是,這運行真的很慢,大概是因爲存在的條款。我希望增加LIMIT會顯着加快速度,但不幸的是我發現經驗證明這不是事實。加速使用存在的SQL查詢
是否有另外一種方式來編寫這個查詢,它返回的是「可接受」速度的相同值?我意識到「可接受」是主觀的,但我只是在尋找新的方法。
下面是使用的表:
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」
生成執行計劃並查看最昂貴的操作(一個好的DBA可以幫助很大)。 'ts_created'上的索引可能會有所幫助。請注意,LIMIT對實際的查詢性能沒有幫助,因爲它可能需要掃描整個表以找到「前10位」結果。 –
你就不能使用'選擇inner_content.id FROM content_revision JOIN內容inner_content ON content_revision.content_id = inner_content.id GROUP BY inner_content.id HAVING COUNT(*)= 1個 ORDER BY ts_created DESC LIMIT 10;' – artm
@artm - 我希望能夠做到這樣的事情,不幸的是,這會導致錯誤......因爲我是通過''inner_content.id'''進行分組的,所以我不能通過ts_created進行ORDER BY,因爲有可能是由不同的ts_created組合在一起的多個列。由兩列分組將撤銷GROUP BY語句,因爲ts_created值基本上都是唯一的。 :( – wheresmycookie