(可能是重複的,但我只能找到與JOIN [3]
的問題和解決方案,這就是不是一個選項)哪個子查詢更快?
我有兩個表。非常薄(很少列)和非常長(很多行)。一個是數據表(articles
),另一個是ACL表(acl
)。
我想只顯示通過acl.some_id
訪問的文章。哪個子查詢更快?
[1]
SELECT a.title
FROM articles a
WHERE 0 < (
SELECT COUNT(1)
FROM acl
WHERE article_id = a.id AND some_id IN (1, 2, 3)
)
或
[2]
SELECT a.title
FROM articles a
WHERE a.id IN (
SELECT article_id
FROM acl WHERE some_id IN (1, 2, 3)
)
我心中想說的第二個,因爲子查詢可重複使用的所有潛在的匹配行,因此將只執行一次(雖然結果集將是非常大的),而第一個子查詢將不得不檢查每一個可能匹配的行。
還有第三種方法,但這是不是一個選項,因爲它會重複行(和GROUP BY不是解決方案,因爲我需要COUNT以後的其他東西(和DISTINCT永遠不是解決方案!)):
[3]
SELECT a.title
FROM articles a
JOIN acl
ON acl.article_id = a.id
WHERE acl.some_id IN (1, 2, 3)
由於article_id的X存在N次acl
,它將返回該行0 - N次,而不是0 - 1
還有第四個方法:EXISTS
。感謝ypercube。
相關:
你寫的代碼... **嘗試它,並找出來!** – 2013-03-20 22:20:07
嘗試一次或15次並不意味着什麼。我想要爲什麼。而且這些表格還不長=),所以執行時間將非常非常短。 – Rudie 2013-03-20 22:21:32
mysql擁有你需要自己回答這個問題的所有工具。查看每個查詢的執行計劃。查看執行時間。你可以這樣做。 – 2013-03-20 22:24:11