MYSQL - 获得围绕坐标的最快方法

时间:2017-01-01 20:45:55

标签: php mysql

我试图获得积分" me"按位置而且非常简单:

select * from X where ((SQRT(POW(69.1 * (a.lat - 49.201441 ), 2) + 
POW(69.1 * (16.161299 - a.lng) * COS(a.lat / 57.3), 2))) <='1') LIMIT 5

*

my location = 49.201441;16.161299
distance = 1 (mile)

此查询返回5分左右&#34; me&#34;在1英里的距离。这很快,但就在我的桌子有......我不知道,可能是5000行。

我在200 000行表格上使用此查询,而且速度非常慢!也许.. 2-7秒,即使限制为1 =没有差异。

有人可以向我解释并帮助我吗?非常感谢你们!

BTW:如果我的查询不包含查询的这一部分=它可能需要0.0008s ...所以查询的第二部分是正确的。

1 个答案:

答案 0 :(得分:0)

我用它来寻找你附近的人。

表名:user_location

ID |用户名|纬度|经度

我不确定距离是一英里,但是这样做会使用户拉近减去数据库中的每个人。如果用户lat和long在1之内,它将被放入结果中。

最大的问题是1不等于1英里。我相信它已经接近10英里(它不久前可能不是10英里,我记不清了),但你总能改变它。另一个问题是你基本上总是需要更新人们的位置。这并不是那么糟糕,但是如果你的服务器速度很慢而且用户很多,那么它可能会让你失望。

它快速且有效......不是最好的解决方案,但可能适合您。对我来说,它至少表现出一个不错的周边区域。

$query = "SELECT * FROM `user_location` WHERE (".$user_lat." - latitude) <= 1 AND (".$user_lon." - longitude) <= 1 LIMIT 100";

我用10000行测试了这个,我不到3秒,我附近有254人。 (随机生成的内容)