我有一个查询返回所有记录,与我的 MySQL 5.7 数据库中的 POINT 字段相比,按距固定点的距离排序。

举个简单的例子,假设它看起来像这样:

SELECT shops.*, st_distance(location, POINT(:lat, :lng)) as distanceRaw
FROM shops
ORDER BY distanceRaw
LIMIT 50

我的实际查询还必须进行一些连接才能为结果获取其他数据。

问题是,为了按距离对数据进行排序,它需要计算数据库中每条记录的距离(目前大约有 100,000 条记录)。

我无法缓存查询,因为它只会特定于那些原始坐标。

无论如何限制必须计算的数据?例如,对附近商店进行可靠的粗略计算,例如 lat + lng 的 +/- 3 度?所以它只需要处理数据的一个子集?

如果有人在这种优化方面有任何经验,我希望得到一些建议,谢谢。

最佳答案

是的,您可以在 where 标准中使用一些简单的近似值来过滤掉那些明显超出半径的位置。标题为“SQL(MySQL、PostgreSQL、SQL Server)的快速最近位置查找器”的This great blog post 描述了这样的优化:



以上描述了边界矩形的理论背景。

关于mysql - 提高空间 MySQL 查询的性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36128379/

10-13 07:46
查看更多