结合Postgres的传统和空间指数

时间:2016-05-09 20:42:34

标签: postgresql gis

我有时间戳位置数据。

我希望Postgres有效地执行时间和空间有限的查询。 e.g。

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问题。)

2 个答案:

答案 0 :(得分:1)

btree_gist扩展允许您在时间戳上创建一个gist索引,这样就可以将它们与PostGIS索引结合起来。 PostgreSQL也可以在一个查询中use multiple indexes。您必须测试并查看哪种组合表现最佳。

答案 1 :(得分:1)

此特定表架构的索引可能会有很大差异,具体取决于您需要获取哪些信息。

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

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);