Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在两列上创建索引以检查日期是否介于这两列之间_Sql_Postgresql_Laravel_Laravel 5_Rdbms - Fatal编程技术网

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

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'); 但我也看到了创建复合索引的选项 我的问题是,为上述

我用的是Laravel 5和postgres。有一个表有两列“开始日期”和“结束日期”。我想创建一个索引,这样我就可以轻松地检查一个日期是否介于这两个日期之间

我使用下面的代码来实现这一点

$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。