7

この質問に示されているように: Ruby on Rails 移行で列を一意にしてインデックスを作成するにはどうすればよいですか?
あなたは書ける:

add_index :the_table, [:foo_column, :bar_column], unique: true

複数列のインデックスを追加します。
しかし、既に複数列のインデックスを指定した各列に対して、単一のインデックスを追加する必要があるでしょうか?

上記のコードに加えて、以下のコードを書くようなことを意味します。

add_index :the_table, :foo_column  
add_index :the_table, :bar_column
4

2 に答える 2

20

MySQL の場合:

MySQL は、インデックス [:foo_column, :bar_column] を使用して、両方の列の条件をクエリし、左側の列のみの条件をクエリできますが、右側の列はクエリできません。

詳細はこちら: http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

だからあなたはすべきです

add_index :the_table, [:foo_column, :bar_column], :unique => true
add_index :the_table, :bar_column

すべてを適切にインデックス化するために

MySQL は列を左から右にインデックス付けするため、この : のような複数列のインデックスがある場合[:col1, :col2, :col3, :col4]、このインデックスを : でクエリできます。

  • col1
  • col1 + col2
  • col1 + col2 + col3
  • col1 + col2 + col3 + col4

したがって、一番左の列を照会できます

他に何か必要な場合は、さらにインデックスを作成する必要があります

繰り返しますが、これは MySQL のみです。postgres は異なる動作をする可能性があります

于 2012-11-08T22:07:02.780 に答える
7

PostgreSQL の場合:

PostgreSQL: ドキュメンテーション: マルチカラム インデックスには次のように書かれています。

複数列のB ツリー インデックスは、インデックスの列の任意のサブセットを含むクエリ条件で使用できますが、インデックスは先頭 (一番左) の列に制約がある場合に最も効率的です。正確なルールは、先頭の列の等式制約と、等式制約を持たない最初の列の不等式制約を使用して、スキャンされるインデックスの部分を制限することです。これらの列の右側にある列の制約はインデックスでチェックされるため、適切なテーブルへのアクセスは節約されますが、スキャンする必要があるインデックスの部分は減りません。

この領域では、PostgreSQL は MySQL と同じように動作するようです。

于 2012-11-09T00:01:41.303 に答える