在两列上创建索引以检查日期是否介于这两列之间

时间:2016-05-09 08:56:46

标签: sql postgresql laravel laravel-5 rdbms

我正在使用Laravel 5和postgres。有一个表有两列'start_date'和'end_date'。我想创建一个索引,以便我可以轻松检查日期是否介于这两者之间。

我正在使用以下代码来执行此操作

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

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

但是我看到有一个创建复合索引的选项。

我的问题是为上述场景创建索引的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

取决于您的查询。虽然像MySQL这样的其他数据库在大多数情况下每个表只能使用一个索引,但postgresql可以使用多个。

因此,如果在start_date和end_date上有两个单独的索引,则如果close关闭两个列的条件,则它们都将被使用。请注意,无法保证可以使用两个索引甚至其中一个索引。例如,如果您只有几行,那么在不引用索引的情况下直接检索数据会快得多。在这种情况下,具有复合索引也不会有多大用处。

如果您有其他查询只涉及两列中的一列,那么您最好再使用两个单独的索引

答案 1 :(得分: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