2012-01-18 18 views
3

私はテーブルが2つあります:製品カテゴリです。各カテゴリには多くの製品があり、製品は多くのカテゴリに属する​​ことができます。外部キーとインデックス

製品

product_id - int primary auto increment 
name - unique 
etc. 

カテゴリ

category_id - int primary auto increment 
name - unique 
etc. 

私は多対多の関係のための第三のテーブルを持っています。

products_categories

product_id -> foreign key: products.product_id 
category_id -> foreign key: category.category_id 

私の質問は:私はproduct_categories速く選択クエリのproduct_idcategory_idのインデックスを作成し、そうであれば、どのようなインデックスをすべきか?

ありがとうございました

答えて

2

どのクエリが最も頻繁に行われるかによって異なります。

3つのインデックスで終わることがあります。

  1. あなたは... WHERE products_categories.product_id = XXXを持っている場合は、product_idにインデックスを作成します。 category_id

  2. ため

  3. 同じあなたはしかし... WHERE products_categories.category_id = XXX AND products_categories.product_id = YYY

following the MySQL manualを持っている場合(category_id, product_id)にインデックスが持つ冗長であってもよいことに注意してください、category_idproduct_idの両方にインデックスを作成します。 (category_id)のインデックス。同様に、(product_id, category_id)のインデックスは、(product_id)のインデックスで冗長かもしれません。したがって、最終的には、頻繁なクエリの必要性をすべてカバーする2つのインデックス(3つではなく)で終わることがあります。

+2

と言うだけで、一方向に固執する必要があります。category_idとproduct_idのどちらかのクエリを作成するか、その逆です。次に、複合インデックスが1つだけ必要となり、2つ目の単純なインデックスを追加することがあります。 – mkk

+0

説明してくれてありがとう、複数の列インデックスに私を紹介してくれてありがとう。 –

1

FOREIGN KEY制約は、制約のソースフィールドについて何も表示しないので、インデックスを作成する必要があります。したがって、インデックスを自動作成しません。

「どの索引」の質問に対して、あなたは一意の索引を必要としません。そして、私はBTREEであるデフォルト索引に固執します。

+0

ありがとうございます:FOREIGN KEY制約は、制約のソースフィールドについては何も言いません。 –