【发布时间】:2016-08-29 07:45:38
【问题描述】:
现在我有一个包含 1 亿次插入的表:
CREATE TABLE o (
id int UNIQUE,
latitude FLOAT(10, 8),
longitude FLOAT(11, 8)
);
在我的后端,我收到一个用户 lat/long 并尝试返回 x 距离内的所有内容。
我认为我可以计算 X 距离的最大纬度/经度,而不是对每个结果都进行距离公式。
所以我们通过找到最大纬度/最小纬度、最大经度/最小长度来创建一个正方形。
一旦我们有了这些最大值,我们就会对这个值范围进行查询,从而使我们的子集显着减小,然后再执行实际距离公式(即,找到 X 距离内的值)。
所以我的问题是: 是什么让我跑得更快?
选项 1)
- 1亿条目的距离公式得到集合。
选项 2)
- 我们计算的是最小/最大纬度/经度,而不是对 1 亿个条目的集合执行距离公式。
- 从一亿个条目的表中选择该范围内的值
- 在我们新的较小集合上计算距离公式。
选项 3)
- SQL 中已经存在这方面的内容
如果选项 2 更快,那么下一个问题实际上是解决该数学问题。
如果你想看那个继续阅读:
经/长距离公式
dlon = lon2 - lon1
dlat = lat2 - lat1
a = (sin(dlat/2))^2 + cos(lat1) * cos(lat2) * (sin(dlon/2))^2
c = 2 * atan2(sqrt(a), sqrt(1-a))
d = R * c
显然我们可以重新排列,因为 D(假设 1 英里)和 R(是地球的半径)是一个设定值,所以我们得到 D/R = C。
那么问题来了,我们如何计算 C/2 = atan2(sqrt(a), sqrt(1-a))?
【问题讨论】:
-
你在重新发明轮子。看mysql空间数据类型和函数。
标签: mysql math latitude-longitude