如何使用条件创建索引并使用它

时间:2018-10-04 03:37:10

标签: postgresql postgresql-9.6

我有一个只有三列的表:idtimevalue

我已经在(id, time)上建立了索引。

现在我需要加快最近的数据查询的速度,所以我认为我需要每天创建一个新索引。

create index heat_20181001_20181003 on mytable using
brin ("id", "time") where time between '2018-10-01 00:00:00' and 
'2018-10-03 23:59:59';

但是当我查询时,它显示使用旧索引,而未使用新索引。

查询:

EXPLAIN  ANALYZE ( select * from mytable where time between 
'2018-10-01 00:00:00' and '2018-10-03 23:59:59' and "id" = '453615414');

结果:

Index Scan using "mytable_id_579df36b7ac8aa8e_idx" on mytable 
  (cost=0.57..3931.98 rows=1133 width=87) (actual time=3.045..12294.511 rows=3762 loops=1)
  Index Cond: ((("id")::text = '453615414'::text) AND ("time" >= '2018-10-01 00:00:00+08'::timestamp with time zone) AND ("time" <= '2018-10-03 23:59:59+08'::timestamp with time zone))
Planning time: 0.320 ms
Execution time: 12295.688 ms
(4 rows)

如何使用索引进行查询?或者我该如何改善?

1 个答案:

答案 0 :(得分:0)

如果时间间隔可变,则您的原始索引是完美的(这就是PostgreSQL使用它的原因)。

如果时间间隔是恒定的,那么理想的索引应该是

CREATE INDEX ON mytable (id)
   WHERE time BETWEEN '2018-10-01 00:00:00' AND '2018-10-03 23:59:59';

BRIN索引可能没有用,因为表中元组的物理顺序与索引顺序不同。

您当然应该每天创建索引,您的原始索引就足够了。