【问题标题】:MYSQL - fastest way to get points around coords [duplicate]MYSQL - 获得坐标点的最快方法[重复]
【发布时间】:2017-05-16 02:11:21
【问题描述】:

我正在尝试按位置获取“我”周围的积分,这非常简单:

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)

此查询返回我周围 1 英里处的“我”周围的 5 个点。这很快,但就在我的表有一个......我不知道,可能是 5000 行时。

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

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

顺便说一句:如果我的查询不包含这部分查询 = 可能需要 0.0008 秒...所以查询的第二部分是正确的。

【问题讨论】:

标签: php mysql


【解决方案1】:

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

表名:user_location

id|用户名|纬度|经度

我不确定距离是否为一英里,但这样做是将用户 lat 减去数据库中的每个人。如果用户 lat 和 long 都在 1 以内,则将其放入结果中。

最大的问题是 1 不等于 1 英里。我相信它接近 10 英里(这是不久前的事,我不记得可能不是 10 英里),但你总是可以改变这个。另一个问题是您基本上总是必须更新人们的位置。这还不错,但如果您的服务器速度较慢且用户众多,它可能会拖慢您的速度。

它快速且有效...不是最好的解决方案,但可能对您有用。对我来说,它至少显示了一个不错的周边区域。

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

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

【讨论】:

  • 谢谢,但我需要准确的距离。我的数据库中有 1 000 000 多个点,我需要将其计算到 0.00x 秒。而且我无法在每次“插入”时更新每一行,因为我每 1 分钟导入一次 XXXX 数据。但对其他人来说很好的解决方案:-)
  • 您可以只计算距离并更改数字。但只有当他们的位置是最新的时,它才会准确。我用它来寻找你附近的人(有点像耳语)。就我个人而言,我只在他们每次登录时更新它,每 30 分钟重新连接一次。因此,如果没有所有疯狂的流量,它仍然是一些不错的东西。我可以在 1 个城市街区内找到这个精确的人,我只是不知道在纬度/经度尺度上英里/英尺/米与 1 的比率。
猜你喜欢
  • 1970-01-01
  • 2021-10-28
  • 2011-05-21
  • 2015-06-25
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多