加快邮政编码距离搜索,搜索500k项目

时间:2015-07-29 12:53:04

标签: php mysql laravel

我有一个500k到有时超过100万个位置的数据库。

我网站上的用户输入他们的邮政编码,我需要按距离显示他们的位置。当我在我的数据库中只有100k位置时,这实际上非常快,但现在它需要3秒以上,即使在非常大的VPS实例上也是如此。

以下是我使用lat / lng并按距离搜索的查询:

select *,
( 3959 * acos( cos( radians(41.8817767) ) *
cos( radians( lat ) )
* cos( radians( lng ) - radians(-87.6371461)
) + sin( radians(41.8817767) ) *
sin( radians( lat ) ) )
) AS distance from `locations` where `locations`.`deleted_at` is null     having `distance` < '500' order by `distance` asc limit 500

这里有什么明显的东西可以加快速度吗?我可以继续升级我的服务器,但速度很快。

1 个答案:

答案 0 :(得分:1)

我建议使用弹性搜索,因为它内置了对GIS /距离计算的支持。

将对象添加到弹性搜索中,然后向MySQL表提供距离和对象标识符列表。从查询中获取列表后(如下),只需获取从搜索中选择的对象。

CollectionUtils.isNotEmpty(collection)

(摘自https://www.elastic.co/guide/en/elasticsearch/guide/current/sorting-by-distance.html