首页 > 解决方案 > MySQL优化几何查询

问题描述

我有一个查询,它Point()首先按最近距离的顺序正确返回给定 X 英里范围内的行,但是我在优化查询时遇到问题,该查询目前需要 6-8 秒才能从包含约 250k 行的表中返回 10 行。

geometry Location列已有空间索引。

我目前的查询是:

SELECT *,  ROUND(ST_Distance_Sphere(Location, ST_GeomFromText('POINT(lng lat)', 4326)) / 1609.344, 2) as DistanceFromTargetInMiles   
       FROM Business
       -- within 5 miles
       WHERE  ST_Distance_Sphere(Location, ST_GeomFromText('POINT(lng lat)', 4326)) /1609.344 < 5
         -- show closest results first
         order by DistanceFromTargetInMiles 
         asc LIMIT 10

我能做些什么来提高这个查询的速度?这是 MySQL 8.0.1.3

标签: mysqloptimizationspatial

解决方案


您可以尝试在 where 子句中添加附加条件以检查位置是否包含信封 (posX - dist/2, posY - dist/2), (posX + dist/2, posY + dist/2)。这更容易计算,如果记录不包含信封,它将立即被排除,并且不会执行更耗费资源的操作 ST_Distance_Sphere。

我尝试这样做一次并得到了改进。但是,我使用相当旧的 MySQL 版本完成了此操作,因此新版本可能不会从这种方法中受益。


推荐阅读