相关疑难解决方法(0)

尽管使用了索引,但 MySQL 地理空间查询非常慢

我需要按距离从 InnoDb 表中获取记录(不能完全正确)并按距离排序。该表有 1000 万条记录。

到目前为止,我最好的时间是 8 秒(没有按距离排序的 3 秒),这使得它无法使用。我该如何改进?

我有一个定义为 SRID 4326 的点列。我使用的是 MySQL 8.0.12。

SELECT mp.hash_id, 
ROUND(ST_Distance(ST_SRID(POINT(8.53955, 47.37706), 4326), mp.geo_pt), 2) AS distance
  FROM member_profile mp 
  WHERE
    MBRCONTAINS(ST_GeomFromText(
      CONCAT('POLYGON((', ST_X(POINT (8.53955, 47.37706)) - 0.43415340086831, ' ',
        ST_Y(POINT (8.53955, 47.37706)) - 0.43415340086831, ',',
        ST_X(POINT (8.53955, 47.37706)) + 0.43415340086831, ' ',
        ST_Y(POINT (8.53955, 47.37706)) - 0.43415340086831, ',',
        ST_X(POINT (8.53955, 47.37706)) + 0.43415340086831, ' ',
        ST_Y(POINT (8.53955, 47.37706)) + 0.43415340086831, ',',
        ST_X(POINT (8.53955, 47.37706)) - 0.43415340086831, ' ',
        ST_Y(POINT (8.53955, 47.37706)) …
Run Code Online (Sandbox Code Playgroud)

mysql performance spatial query-performance

8
推荐指数
2
解决办法
2331
查看次数

MySQL 或 MariaDB 是否支持 GIS KNN 索引查询(k-最近邻)?

例如,您可以在 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)

SQL Server 有一个类似的方法

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 是什么,你可以在这里看到描述

KNN 系统通过评估 PostGIS R-Tree 索引内边界框之间的距离来工作。

因为索引是使用几何体的边界框构建的,任何不是点的几何体之间的距离都将是不精确的:它们将是几何体的边界框之间的距离。

这里的关键是 KNN …

mysql mariadb index spatial

5
推荐指数
1
解决办法
1097
查看次数

标签 统计

mysql ×2

spatial ×2

index ×1

mariadb ×1

performance ×1

query-performance ×1