我有一张postgis的分数表,有4.6亿条记录。它有一个时间戳和点列。
我正在基于此数据构建图形,该数据是属于最接近点的每个时间戳的值的列表,传单将地图(用户点击的位置)的经纬度发送到生成图表的脚本,准备好的数据。
None
这很好(对于某些点击),但是必须有一种更好/更快的方法,我希望查询知道要听的点,并仅返回该点的值。对此要求有更好的功能吗?
答案 0 :(得分:2)
您拥有什么几何学之王?您正在使用什么投影? 我将假设您的观点在wgs84(epsg:4326)
如果您希望距离是准确的,最好在计算中使用地理位置:
alter points_table add column geog geography
update points_table set geog = geom::geography
创建索引,然后运行cluster
和analyze
以加快查询速度
create index my_index_geog on points_table using gist(geog) /* change geog for geom if using geometry */
cluster points_table using my_index_geog
analyze points_table
获取最接近的点:
SELECT point_id
FROM points_table
ORDER BY geog <-> ST_SetSrid(ST_MakePoint($get_lon, $get_lat),4326)::geography limit 1;
一起获得值:
select value
from table
where point_id = (SELECT point_id
FROM points_table
ORDER BY geog <-> ST_SetSrid(ST_MakePoint($get_lon, $get_lat),4326)::geography limit 1)
order by thedate
limit 1000;
另外,我建议保留一个仅包含点ID和几何/地理的表,以便最接近点的查询运行更快。如果创建名为only_points
的表,查询将变为:
select value
from table
where point_id = (SELECT point_id
FROM only_points
ORDER BY geog <-> ST_SetSrid(ST_MakePoint($get_lon, $get_lat),4326)::geography limit 1)
order by thedate
limit 1000;
如果您需要继续使用geometry
,则需要在几何图形上创建索引,基于geom
进行聚类并运行查询:
select value
from table
where point_id = (SELECT point_id
FROM points_table
ORDER BY geom::geography <-> ST_SetSrid(ST_MakePoint($get_lon, $get_lat),4326)::geography limit 1)
order by thedate
limit 1000;
但是,它会变慢,因为您将在每一步上都转换为地理位置