MySQL在大型数据库中的子查询效率

时间:2015-02-12 19:08:03

标签: mysql performance

我正在努力想出最有效的方法来解决以下问题。我有一个大表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))))

我的问题是,有什么更好的方法来解决这个问题?我非常肯定这是解决这个问题的最有效方法之一,非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

另一个解决方案在这里找到:http://mysql.rjweb.org/doc.php/latlng它基本上是O(1),而大多数基于索引的解决方案是O(sqrt(N))。

我的技术适用于InnoDB。空间索引需要MyISAM(直到5.7)。