【发布时间】:2025-12-19 15:40:07
【问题描述】:
我的桌子看起来像:
CREATE TABLE public.places
(
id bigint DEFAULT nextval('places_id_seq'::regclass) PRIMARY KEY NOT NULL,
lon numeric(18,13) DEFAULT NULL::numeric,
lat numeric(18,13) DEFAULT NULL::numeric,
location geography(Point,4326)
);
CREATE INDEX places_ll ON public.places (lon, lat);
CREATE INDEX places_location_ix ON public.places (location);
INSERT INTO public.places (id, lon, lat, location) VALUES (1, 14.4783371228873, 46.0299536240291, '0101000020E610000003CD3585D50347400287769AE8F42C40');
现在我不想通过查询找到附近的位置:
SELECT ST_Distance(Geography(ST_MakePoint(14.47859, 46.02998166)), location) as dist, lon, lat, location FROM places
WHERE ST_DWithin(Geography(ST_MakePoint(14.47859, 46.02998166)), Geography(location), 50) ORDER BY dist LIMIT 1;
我得到零结果。然后我尝试查询:
SELECT ST_Distance(Geography(ST_MakePoint(14.47859, 46.02998166)), ST_MakePoint(lon,lat)) as dist, lon, lat, location FROM places
WHERE ST_DWithin(Geography(ST_MakePoint(14.47859, 46.02998166)), Geography(ST_MakePoint(lon,lat)), 50) ORDER BY dist LIMIT 1;
我得到了一个结果:
14.4783371228873 46.0299536240291 0101000020E610000003CD3585D50347400287769AE8F42C40
问题是第二个查询返回结果但慢得多,而第一个查询不返回结果但非常快(索引搜索)。我当然想要两者的混合。毫不奇怪,我希望尽快取得成果。
【问题讨论】:
-
不相关:为什么将 x,y 和地理位置放在同一张表中?
-
不相关 - 如果您在地理/几何上创建索引,则创建 GIST 索引而不是 btree 索引 CREATE INDEX ON public.places using GIST(location); Btree 不适用于 ST_Dwithin 和其他函数
-
您还可以从 geom 获取 lat 和 long 作为 st_x(location) 和 st_y(location) 。不要将 lon lat 用作单独的列,这是多余的。
标签: sql postgresql postgis