[3]
(おそらく重複していますが、JOINを使用した質問と解決策しか見つけることができず、それはオプションではありません。)
2つのテーブルがあります。非常に薄い(列が少ない)と非常に長い(行が多い)。1つはデータテーブル(articles
)で、もう1つは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)
)
最初のサブクエリは潜在的にすべてをチェックする必要があるのに対し、そのサブクエリは一致する可能性のあるすべての行に再利用できるため、1回だけ実行されます(結果セットは非常に大きくなります)ので、私の心は2番目のものを言います一致する行。
3番目の方法がありますが、行が重複するため、これはオプションではありません(また、後で何かのためにCOUNTが必要になるため、GROUP BYは解決策ではありません(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-1ではなく0-N回返されます。
4番目の方法もあります:EXISTS
。ypercubeに感謝します。
関連している: