ユーザーが PDF をアップロードしていない特定のモジュール (記事のサブセット) 内の記事をすばやく表示するクエリが必要です。以下で使用しているクエリは、Article テーブルに 300,000 件の記事があり、モジュールに 6,000 件の記事がある場合、約 37 秒かかります。
SELECT *
FROM article a
INNER JOIN article_module_map amm ON amm.article=a.id
WHERE amm.module = 2 AND
a.id NOT IN (
SELECT afm.article
FROM article_file_map afm
INNER JOIN article_module_map amm ON amm.article = afm.article
WHERE afm.organization = 4 AND
amm.module = 2
)
上記のクエリで行っていることは、最初に記事のリストを選択したモジュールに切り捨て、次にそのリストをサブクエリにない記事に切り詰めることです。サブクエリは、組織が既に PDF をアップロードした記事のリストを生成しています。したがって、最終的な結果は、組織がまだ PDF をアップロードしていない記事のリストになります。
事前に感謝します。
編集 2012/10/25
@fthiella の助けを借りて、以下のクエリは驚くべきことに 1.02 秒で実行され、37 秒以上から短縮されました!
SELECT a.* FROM (
SELECT article.* FROM article
INNER JOIN article_module_map
ON article.id = article_module_map.article
WHERE article_module_map.module = 2
) AS a
LEFT JOIN article_file_map
ON a.id = article_file_map.article
AND article_file_map.organization=4
WHERE article_file_map.id IS NULL