我正在努力想出最有效的方法来解决以下问题。我有一个大表locations
,其中使用两个双精度存储点,一个用于Lat
,一个用于Lng
,它们都是索引的,还有一个radius
。
我正在尝试选择位于给定纬度和经度范围内的所有locations
。我目前的方法是运行一个子查询,首先收集地理广场"中的所有结果,然后根据这些结果,计算距离并确定它是否在范围内,如下:
子查询(仅选择粗糙英里x英里范围内的那些):
SELECT * FROM events WHERE $lat +0.015 > lat AND lat > $lat-0.015 AND $lng +0.02 > lng AND lng > $lng-0.02
通过Haversine确定距离:
SELECT * FROM ( the subquery ) WHERE Radius >= ( 20903520 * acos( cos(RADIANS(Lat)) * cos(RADIANS($lat)) * cos(RADIANS(Lng - $lng)) + sin(RADIANS(Lat)) * sin(RADIANS($lat))))
我的问题是,有什么更好的方法来解决这个问题?我非常肯定这是解决这个问题的最有效方法之一,非常感谢任何帮助。
答案 0 :(得分:0)
另一个解决方案在这里找到:http://mysql.rjweb.org/doc.php/latlng它基本上是O(1),而大多数基于索引的解决方案是O(sqrt(N))。
我的技术适用于InnoDB。空间索引需要MyISAM(直到5.7)。