2016-05-09 6 views
1

私はLaravel 5とpostgresを使用しています。 'start_date'と 'end_date'の2つの列を持つ表があります。私は、これらの2つの間に日付があるかどうかを簡単に確認できるように、索引を作成したいと考えています。2つの列にインデックスを作成して、2つの列の間に日付があるかどうかを確認します

私は

$table->date ('start_date'); 
$table->index('start_date'); 

$table->date ('end_date'); 
$table->index('end_date'); 

ことを行うには、次のコードを使用しています。しかし、私は、あまりにも複合インデックスを作成するためのオプションがあることを見ました。

私の質問は私の上記のシナリオのインデックスを作成する最良の方法は何ですか?

+1

は、データの配信に依存します。実際には、必ず両方の列を指定するかどうかによって決まります。そうでない場合は、別々にインデックスを付けます。あなたが常に両方の列を持っている場合は、2つの列のインデックスが速くなり、それぞれ2つの列が1つずつ表示されます。 –

答えて

1

クエリの内容によって異なります。ほとんどの場合、MySQLのような他のデータベースではテーブルごとに1つのインデックスしか使用できませんが、postgresqlでは複数のインデックスを使用できます。

したがって、start_dateとend_dateのチャンスに2つの別々のインデックスがある場合は、close where whereの両方のカラムに条件がある場合に両方のインデックスが使用されます。両方のインデックスまたはそれらのいずれかを使用することが保証されていないことに注意してください。たとえば、数行しかない場合は、索引を参照せずに直接データを検索する方がはるかに高速です。複合インデックスを持つこのような状況では、どちらもあまり使用されません。

次の2つの列の一つだけを伴う他のクエリを持っている場合は、あなたがもう一度あなたの特定の質問にお答えするために、2つの別々のインデックス

1

とオフに優れている - あなたが欲しいものを、開始/終了範囲と日付を探します(日付)範囲型の索引です。

テーブル定義では実際のdaterangeを使用できますが、PostgreSQLはインデックス内の式をサポートしているので、不要です。

CREATE TABLE t1 (start_date date, end_date date); 
INSERT INTO t1 SELECT '2001-01-01' + i, '2001-02-01' + i FROM generate_series(0,9999) i; 
CREATE INDEX date_range_idx ON t1 USING gist (daterange(start_date, end_date)); 
SELECT * FROM t1 WHERE daterange(start_date,end_date) @> '2002-01-01'::date; 

詳細はmanualを参照してください。

+0

あなたの答えをありがとう、それは有益だった。しかし、私は現在、Laravel移行APIのみを使用することを考えています。 –

関連する問題