1

我有一张包含 1000 万条记录的表。每条记录表示一个人。每条记录都有 person_id、纬度、经度、邮政编码。我想选择一个查询并告诉 10 英里半径内有多少其他人(距离可以从纬度和经度计算)。搜索 1000 万条记录并计算距离以检查是否在 1000 万条之内不是一个好方法。所以,我只会在邻近的邮政编码中搜索(我会以某种方式得到它)。如何搜索具有特定邮政编码的条目(不是全部 1000 万条记录)?

4

1 回答 1

1

为什么不先用 lat/long 创建一个在所有四个方向上延伸 10 英里的盒子呢?

然后发出一个查询,在该框中查找具有 lat/long 的人。使用 WHERE

x > xLess10 and x < xPlus10 and y > yLess10 and y < yPlus10

现在您有一个较小的列表,您可以使用类似于sqrt((x1 - x2)^2 + (y1 - y2)^2)该较小列表的内容计算实际距离。但它必须在一个球体上工作,而不是一个以英里为单位的网格。

您可以尝试添加一个and zip in (555555, 555556, etc)以查看它是否运行得更快。一个预先计算的所有其他邮政编码列表,位置在一个邮政编码内任何地方 10 英里范围内,很容易在另一个表中设置。

@Randy 发表的评论让我意识到这对于距离北极和南极 10 英里范围内的位置效果不佳。也许这并不重要,因为那里的人口非常少。或者使用另一种方法,让每个人都围绕极点和南(或北)10 英里或 x,y 位置围成一圈。

此外,您必须找到一种将纬度/经度转换为英里的方法。距离赤道越远,纵向线越靠近。

于 2013-07-19T19:21:02.817 回答