0

私が開発中の Web アプリに最適な mysql db 構造について考えているときに、アイテムの分類にタグを使用する必要があるため、最も一般的なアプローチと思われるものを選択することにしました: アイテム間に tag_map db テーブルを使用するテーブルとタグ テーブル。たとえば、それぞれ Clients テーブルと Tag テーブルがあります。

Example of Clients table:
id,name
0,jack
1,john
2,anna

Example of Tags table:
id,tag
0,likes_oranges
1,likes_cars
2,likes_vacations

Example of tag_map
id,client_id,tag_id
0,0,0 (jack likes oranges)
1,0,1 (jack likes cars)
2,0,2 (jack likes vacations)
3,1,0 (john likes oranges)
4,1,1 (john likes cars)
5,2,1 (anna likes cars)

この分布を考慮し、クライアント テーブルが 100 万行を超える可能性があると仮定すると、私の質問は次のとおりです。「休暇のような」タグを持たないすべての顧客を照会するための最良の方法は何ですか?

私の最初の選択は以下を使用することでした:

select name from clients where id not in (select client_id from tag_map where tags.tag = 'likes vacations')

ただし、クライアントと tag_map テーブルが数千のレコードを超えると、このクエリは非常に遅くなります。

また、tag_map を client テーブルにそのまま結合しようとしましたが、すべてのクライアントに複数のタグが割り当てられているため、NOT NULLを使用しても機能しませんでした。特定のタグ ID を持っていない人だけをカウントしたいからです。 (休暇が好きです)。

このタイプの要件に最適な選択ステートメントについてアドバイスしてください。

前もって感謝します!

K

4

1 に答える 1

0

tag_map テーブルの client_id と tag_id に必ずインデックスを追加してください。インデックスがないと、多数の行でクエリが非常に遅くなります。

explain select ...クエリ オプティマイザーがクエリを最適化する方法を確認するために使用します。

于 2012-08-02T14:25:42.567 に答える