2016-05-09 5 views
1

Ich benutze Laravel 5 und Postgres. Es gibt eine Tabelle mit zwei Spalten 'start_date' und 'end_date'. Ich möchte einen Index erstellen, damit ich leicht überprüfen kann, ob ein Datum zwischen diesen beiden liegt.Erstellen von Indizes für zwei Spalten, um zu prüfen, ob ein Datum zwischen diesen beiden liegt

Ich verwende den folgenden Code zu tun, dass

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

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

Aber ich sah, dass es eine Option ist auch eine Verbindung Index zu erstellen.

Meine Frage ist, was ist der beste Weg, Indizes für mein oben genanntes Szenario zu erstellen?

+1

hängt von der Datenverteilung und von der Tatsache ab, ob Sie immer beide Spalten angeben werden oder nicht. Wenn nicht, besser sie separat indexieren. Wenn Sie immer beide Spalten in where haben, wäre der Index für zwei Spalten schneller als zwei Spalten. –

Antwort

1

Hängt davon ab, was Ihre Abfragen sind. Während andere Datenbanken wie MySQL in den meisten Situationen nur einen Index pro Tabelle verwenden können, kann postgresql mehr als einen verwenden.

Wenn Sie also zwei separate Indizes für start_date und end_date haben, werden sie wahrscheinlich beide verwendet, wenn die where close Bedingungen für beide Spalten hat. Beachten Sie, dass nicht garantiert werden kann, dass beide Indizes oder auch nur einer von ihnen verwendet wird. Wenn Sie beispielsweise nur wenige Zeilen haben, wäre es viel schneller, die Daten direkt abzurufen, ohne sich auf den Index zu beziehen. In dieser Situation wäre auch ein zusammengesetzter Index nicht von großem Nutzen.

Wenn Sie weitere Fragen haben, die nur eine der beiden Säulen beinhalten, sind Sie wieder besser mit zwei separaten Indizes

1

Um Ihre Frage zu beantworten - finden ein Datum zwischen Start/End-Bereich, was Sie wollen, ist ein Index für einen (Datums-) Bereichstyp.

Sie könnten eine tatsächliche daterange in Ihrer Tabellendefinition verwenden, aber es ist nicht notwendig, da PostgreSQL Ausdrücke in Indizes unterstützt.

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; 

Siehe die manual für alle Details.

+0

Danke für Ihre Antwort, es war informativ. Aber ich denke jetzt nur daran, die Laravel-Migrations-API zu verwenden. –

Verwandte Themen