在 Postgres 中结合传统索引和空间索引

Combining traditional and spatial indices in Postgres

我有带时间戳的位置数据。

我希望 Postgres 高效地执行有时间限制的查询 space。例如

select * 
from tracking_tags
where ts >= '1990-01-01T00:00:00.000Z'
and ts < '2000-01-01T00:00:00.000Z'
and lat > 40.0
and lat < 50.0
and long < 0.0
and long > -10.0

我应该如何从索引的角度处理这个问题?

我很困惑,因为我想我可能需要在 ts 上的普通 b 树索引和 lat/long POINTs 上的 GIST 索引之间做出选择,但我需要一个复合索引(或可能两个)。

假设十年的数据,每天有一千条记录。

(P.S。为废话道歉 SQL,我还没有从 MySQL 切换到 Postgres - 但这个 Postgres 问题。)

一个查询中的btree_gist extension allows you to make a gist index on timestamps which makes it possible to combine them with PostGIS indexes. PostgreSQL also can use multiple indexes。您必须进行测试,看看哪种组合效果最好。

此特定 table 架构的索引可能会因您需要获取的信息而有很大差异。

例如,下面的查询可能会有效地使用索引

CREATE INDEX ON tracking_tags USING gist (point(lat,long), ts);

SELECT * 
FROM tracking_tags
WHERE point(lat,long) <@ box(point(40,-10),point(50,0)) AND
      ts <@ tstzrange'[1990-01-01,2000-01-01)' AND
      lat NOT IN (40, 50) AND long NOT IN (-10, 0);