データベースの設計において正規化の結果、中間テーブルを作ることがよくあると思います。
以下のようなテーブル群があったとします。登録されたユーザーと登録された商品を誰が出品した商品なのかを中間テーブルへ記録しています。
- users
- products
- user_products(中間テーブル)
中間テーブルuser_products
にインデックスを作成する場合、3つの方法が考えられます。
- A:
user_id
とproudct_id
に対してそれぞれ単一インデックスを作成する
- B:
user_id
とproduct_id
の複合インデックスを作成する
- C: AとBの合わせ技
インデックスの作成方法はAとBのどちらが良いのでしょうか。
Railsでuser_products
のような中間テーブルを作成して、user_id
とproduct_id
に外部キー制約を付与すると、それぞれに単一のインデックスが作成されます。
create_table :user_products do |t|
t.references :user, foreign_key: true
t.references :product, foreign_key: true
t.timestamps
end
確証はないのですが「複合インデックスの方が、いいんじゃないの?」と思ってしまいます。
user_products
が参照されるストーリーを考えると、出品された商品の一覧にユーザーと商品情報をつけ合わせたデータが必要になるケースが考えられます。その際にはuser_products
にJOINを行う必要があるためuser_id
とproduct_id
両方のキーを使うことになります。
...と推測ばかりしていてもしょうがないので、実際に計測してみます。
続きを読む