現在、アプリケーションで実行するのに最大10秒かかる現在のMySQLクエリがあります。
SELECT tagid, tag FROM tags WHERE tagid IN
(SELECT DISTINCT tagid FROM news_tags WHERE newsid IN
(SELECT newsid FROM news_tags WHERE tagid IN (16,32)
GROUP BY newsid HAVING COUNT(newsid)>=2))
AND tagid NOT IN (16,32) ORDER BY level, tagid
使用されるテーブルは次のとおりです。
- テーブル
news_tags
、列newsid
あり、tagid
- テーブル
tags
、列tagid
付きtag
、、level
tagid
クエリの目的は、 16と32のタグでタグ付けされた「ニュース」アイテムを検索し、次にこれらのニュースアイテムにもタグ付けされた他のタグを検索して、ユーザーが「ニュース」をさらに絞り込むことができるようにすることです。 "より具体的なタグの組み合わせを持つアイテム。最終的な目標は、テーブルから残りの関連する列tag
を取得することです。tagid
tags
同等の方法でさまざまな試みを試みましたが、提供されたタグが添付されているニュースアイテムのJOIN
残りのすべてを選択できませんでした。tagid
これが私のEXPLAIN
SQLの結果です。これは、私が見逃している別の速度低下の原因を示している場合に備えています。
id | select_type | table | type |possible_keys | key | key_len | ref | rows | Extra 1 |PRIMARY|タグ|範囲|PRIMARY| PRIMARY | 4 | NULL | 55|どこを使用するか; filesortの使用 2 | DEPENDENT SUBQUERY | news_tags | index_subquery | tagid | tagid | 4 | func | 26|インデックスの使用; 場所を使用する 3 | DEPENDENT SUBQUERY | news_tags | index | tagid | PRIMARY | 8 | NULL | 11|どこを使用するか; インデックスの使用
問題を明確にするために、16または32ではなく、タグ16と32の両方でタグ付けされたニュースアイテムのタグを残したかったのです。混乱してすみません。