例如,您可以在 MySQL 上执行k-最近邻算法 (k-NN)查询,以使用 PostGIS 在 PostgreSQL 中找到最近的点,我可以在空间索引上运行 kNN 查询<->
SELECT ST_AsText(geom), city
FROM person.address
ORDER BY geom <-> 'POINT(-121.626 47.8315)'
FETCH FIRST 7 ROWS ONLY;
Run Code Online (Sandbox Code Playgroud)
DECLARE @g geography = 'POINT(-121.626 47.8315)';
SELECT TOP(7) SpatialLocation.ToString(), City
FROM Person.Address
WHERE SpatialLocation.STDistance(@g) IS NOT NULL
ORDER BY SpatialLocation.STDistance(@g);
Run Code Online (Sandbox Code Playgroud)
PostgreSQL 和 SQL Server 都有 KNN。<->
在他们的空间索引上做 KNN的 MySQL 等价物是什么?
KNN 系统通过评估 PostGIS R-Tree 索引内边界框之间的距离来工作。
因为索引是使用几何体的边界框构建的,任何不是点的几何体之间的距离都将是不精确的:它们将是几何体的边界框之间的距离。
这里的关键是 KNN …
在放弃 MySQL 之后,我尝试了 Elasticsearch,现在不想看看我是否可以使用 PostgreSQL/PostGIS,因为它可以让我只使用 PostgreSQL。
我需要按距离(不能完全相同)从表中获取记录并按距离排序。该表有 1000 万条记录。
当我在 PostgreSQL 上查询比在 MySQL 上的查询速度慢时,我想我一定做错了什么。
我可以做什么更好?
桌子:
id | hash_id | town | geo_pt2
geo_pt2 is geography
Run Code Online (Sandbox Code Playgroud)
指数:
CREATE INDEX geo_pt2_gix ON public.member_profile USING gist (geo_pt2)
Run Code Online (Sandbox Code Playgroud)
询问:
SELECT hash_id, town
, ST_Distance(t.x, geo_pt2) AS dist
FROM member_profile, (SELECT ST_GeographyFromText('POINT(47.4667 8.3167)')) AS t(x)
WHERE ST_DWithin(t.x, geo_pt2, 250000)
ORDER BY dist
limit 100 offset 1000;
Run Code Online (Sandbox Code Playgroud)
解释:
Limit (cost=9.08..9.08 rows=1 width=53)
-> Sort (cost=9.07..9.08 rows=1 width=53)
Sort Key: (_st_distance('0101000020E610000088855AD3BCBB474052499D8026A22040'::geography, member_profile.geo_pt2, '0'::double precision, true))
-> …
Run Code Online (Sandbox Code Playgroud) postgresql performance spatial postgis postgresql-10 postgresql-performance
MySQL 支持使用ST_PointFromText
SRID 来构造一个点,
ST_PointFromText(wkt[, srid [, options]])
使用其 WKT 表示和 SRID 构造 Point 值。
这假设输入是众所周知的文本 (WKT)。如何构造一个纬度和经度为双精度(或浮点类型)的点。