【问题标题】:search Big data table搜索大数据表
【发布时间】:2013-07-19 04:39:38
【问题描述】:

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

【问题讨论】:

    标签: sql database algorithm search clustered-index


    【解决方案1】:

    为什么不先用纬度/经度创建一个在所有四个方向上延伸 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 位置围成一圈。

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

    【讨论】:

    • 或者将框保留为“接近”的近似值可能就足够了 - 请注意,您的圆方程对于 GREAT CIRCLE DISTANCE 也不完全正确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    相关资源
    最近更新 更多