SELECT `id`, `field2`, `field3`, `field4` as Title FROM `articles`
WHERE `category_id` = 'X'
AND `id` NOT IN
(SELECT `articleid` FROM `article-seen` WHERE `userid` = 'Y')
これを最適化するにはどうすればよいですか?二重選択は悪いと思いますが、mysqlは初めてです
SELECT `id`, `field2`, `field3`, `field4` as Title FROM `articles`
WHERE `category_id` = 'X'
AND `id` NOT IN
(SELECT `articleid` FROM `article-seen` WHERE `userid` = 'Y')
これを最適化するにはどうすればよいですか?二重選択は悪いと思いますが、mysqlは初めてです
同じ結果が得られますが、クエリがより単純に見えるようになる JOIN を使用してみてください
最適化は、使用している MySQL のバージョンによって異なります (と思います)。
これは、次のように記述しますjoin
。
SELECT `id`, `field2`, `field3`, `field4` as Title
FROM `articles` a left outer join
`articles_seen` arts
on a.id = arts.articleid and arts.userid = 'Y'
where a.`category_id` = 'X' and
arts.id is null;
このクエリは、少なくとも、サブクエリを具体化していません。これは、元のクエリがそうであったと思います。
これを高速化するには、インデックスを追加します。頭に浮かぶものは次のとおりarticles(category_id, id)
ですarticles_seen(userid, articleid)
。のフィールドをselect
最初のインデックスに追加することもできます。これにより、メイン テーブルに戻るのではなく、インデックスを参照するだけでクエリ全体を処理できます。