Sql 在两列上创建索引以检查日期是否介于这两列之间
我用的是Laravel 5和postgres。有一个表有两列“开始日期”和“结束日期”。我想创建一个索引,这样我就可以轻松地检查一个日期是否介于这两个日期之间 我使用下面的代码来实现这一点Sql 在两列上创建索引以检查日期是否介于这两列之间,sql,postgresql,laravel,laravel-5,rdbms,Sql,Postgresql,Laravel,Laravel 5,Rdbms,我用的是Laravel 5和postgres。有一个表有两列“开始日期”和“结束日期”。我想创建一个索引,这样我就可以轻松地检查一个日期是否介于这两个日期之间 我使用下面的代码来实现这一点 $table->date ( 'start_date' ); $table->index('start_date'); $table->date ( 'end_date' ); $table->index('end_date'); 但我也看到了创建复合索引的选项 我的问题是,为上述
$table->date ( 'start_date' );
$table->index('start_date');
$table->date ( 'end_date' );
$table->index('end_date');
但我也看到了创建复合索引的选项
我的问题是,为上述场景创建索引的最佳方法是什么?取决于您的查询内容。而其他数据库,如MySQL,在大多数情况下,每个表只能使用一个索引,postgresql可以使用多个索引 因此,如果在开始日期和结束日期上有两个单独的索引,那么如果where close对这两列都有条件,那么它们都将被使用。请注意,不能保证两个索引或其中一个都可以使用。例如,如果只有几行,那么直接检索数据而不引用索引会快得多。在这种情况下,拥有一个综合指数也没有多大用处
如果其他查询只涉及两列中的一列,最好使用两个单独的索引来回答您的特定问题-在开始/结束范围之间查找日期,您需要的是(日期)范围类型的索引 您可以在表定义中使用实际的
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;
有关完整的详细信息,请参阅。取决于数据分布以及是否总是同时指定这两列。如果没有,最好将它们单独索引。如果你总是把两列都放在where中,那么两列索引会比两列一列快。谢谢你的回答,它提供了信息。但我现在只考虑使用Laravel迁移API。