在位置数量庞大的mysql中查找和排序位置之间的距离

在位置数量庞大的mysql中查找和排序位置之间的距离,mysql,node.js,geolocation,Mysql,Node.js,Geolocation,我在MySQL数据库中存储了超过500000个位置,并且每天都会增加,我需要根据用户的位置检索最近的10个位置 我已经设法做到了这一点,但我面临着大量地点的性能问题 执行查询需要7秒 我使用这样的查询 select * from (select id,name ,calc_distance(long,lat) as distance from locatoin) as location_with_distance order by distance limit 10. 基于上述情况,在这些情

我在MySQL数据库中存储了超过500000个位置,并且每天都会增加,我需要根据用户的位置检索最近的10个位置

我已经设法做到了这一点,但我面临着大量地点的性能问题

执行查询需要7秒

我使用这样的查询

select * from (select id,name ,calc_distance(long,lat) as distance from locatoin) as location_with_distance order by distance limit 10. 
基于上述情况,在这些情况下使用的最佳实践是什么?或者,是否有任何数据库系统设计用于这种情况


注意:-查询的主要问题是排序,而不是计算距离函数。

否。主要问题是计算距离函数,而不是排序(mysql非常擅长排序)。由于您必须首先计算所有距离才能订购,因此这里的瓶颈是距离函数。您可以预先计算到某些默认位置(信标)的距离,并使用离您的用户最近的信标预先选择可能的位置,并仅计算与这些位置的距离;或者在用户周围用三角形lan删除
订单,但保留
限制10
将告诉mysql只计算它找到的前10个条目。排序依据迫使mysql首先计算每个距离,然后取最近的10个距离。(但您需要最接近的10个,因此需要订购)。因此,在使用距离函数之前,您的查询速度很快的原因是
limit 10
,它使您跳过了499.990距离计算(删除
limit 10
,带/不带
order by
,您将看到)。所以,您可以做的最优化就是在距离计算之前,尝试类似地跳过500.000行中的大部分。