我有3列公司的地址表: company_id , lat , lon 。
我需要与每家公司保持最近的距离。 我对PostgreSQL使用 cube 和 earthdistance 扩展。
查询工作正常但很慢:
SELECT
company_id,
MIN(earth_distance(ll_to_earth(lat,lon), ll_to_earth(53.96,83.96))) AS distance
FROM companies
GROUP BY company_id;
GIST索引如:
CREATE INDEX i_name on companies USING gist(ll_to_earth(lat, lon));
不使用。
我该如何解决这个问题? 感谢。
答案 0 :(得分:3)
通常,索引可以帮助您从大表中查找少量行,或者提高ORDER BY
查询的速度。您的查询需要扫描表中的所有行,并对所有行执行复杂计算。因此,索引无法帮助您,因为Postgres不会将索引用作预先计算的值。
您应该将ll_to_earth(lat, lon)
的值预先计算到单独的列中,并在查询中使用此列。
答案 1 :(得分:0)
你需要一个KNN索引。
CREATE EXTENSION postgis;
ALTER TABLE companies ADD COLUMN geog geography(POINT 4326);
UPDATE companies
SET geog = ST_MakePoint(lon,lat)::geogprahy;
SELECT DISTINCT ON (company_id)
company_id,
ST_Distance(company_id,ST_Point(83.96,53.96)::geography)
FROM companies
ORDER BY company_id, geog <=> ST_Point(83.96,53.96)::geography DESC;