パフォーマンスの向上を念頭に置いて、結合テーブル(特にRails 3 has_and_belongs_to_manyコンテキストで使用される)でどのインデックスが役立つかどうか疑問に思いました。
モデルとテーブルの設定
私のモデルはFoo
でありBar
、レールの規則に従って、と呼ばれる結合テーブルがありますbars_foos
。このテーブルbar_id:integer
との古いフィールドを作成する主キーまたはタイムスタンプはありませんfoo_id:integer
。次のインデックスのどれが最適で、重複がないかを知りたいです。
- 複合インデックス:
add_index :bars_foos, [:bar_id, :foo_id]
- 2つのインデックス
- A。
add_index :bars_foos, :bar_id
- B。
add_index :bars_foos, :foo_id
- 1と2-Bの両方の組み合わせ
基本的に、最初から役立つと仮定すると、複合インデックスで十分かどうかはわかりません。複合インデックスは最初の項目の単一のインデックスとして使用できると思います。そのため、3行すべてを使用すると、不必要な重複が発生することは間違いありません。
使用の可能性
最も一般的な使用法はモデルのインスタンスを与えられますFoo
、私はモデルのインスタンスのためbars
にのRoR構文を使用して関連付けられていることを求めます。foo.bars
逆もまた同様bar.foos
ですBar
。
SELECT * FROM bars_foos WHERE foo_id = ?
これらは、タイプとのクエリをSELECT * FROM bars_foos WHERE bar_id = ?
それぞれ生成し、それらの結果のIDをSELECT * FROM bars WHERE ID in (?)
とに使用しSELECT * FROM foos WHERE ID in (?)
ます。
私が間違っている場合はコメントで訂正してください。ただし、Railsアプリケーションのコンテキストでは、のような両方のIDを指定するクエリを実行しようとすることはないと思いますSELECT * FROM bars_foos where bar_id = ? AND foo_id = ?
。
データベース
データベース固有の最適化手法がある場合は、PostgreSQLを使用する可能性があります。ただし、このコードを使用している他の人は、Railsの構成に応じてMySQLまたはSQLiteで使用したい場合があるため、すべての回答を歓迎します。