我有时间戳位置数据。
我希望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问题。)
答案 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);