V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hackingwu
V2EX  ›  编程

如何实现按照距离排序?

  •  
  •   hackingwu · 2015-08-12 22:30:01 +08:00 · 3823 次点击
    这是一个创建于 3392 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我现在要做一个按照距离排序的,数据库是MySQL,如果我每次请求列表都从数据库中计算两个点的距离(经纬度)计算,一定相关慢?请教一下一般大家都是如何实现?
    我的想法是对备份数据到redis中,每一次请求来,以请求的经纬度做key,去之前备份的redis数据中做一次排序,然后再缓存到redis中,以后的请求如果和其中的key做比较,如果相聚1km则使用缓存的。

    7 条回复    2015-08-13 00:11:34 +08:00
    wy315700
        1
    wy315700  
       2015-08-12 22:30:49 +08:00
    geohash
    Andiry
        2
    Andiry  
       2015-08-12 22:42:32 +08:00 via Android
    把地图划分成方块,然后按方块距离排序,有精确要求的话方块内部再排序
    publicID001
        3
    publicID001  
       2015-08-12 23:00:52 +08:00
    PgSQL大法豪
    ljbha007
        4
    ljbha007  
       2015-08-12 23:28:47 +08:00
    缓存并没有叼用 除非目标点坐标重复的很多 而且是一点都不能偏
    我看了下MySQL的Spatial Index也只是用来查找确切值 不能用来计算距离
    最好的办法也只有先限定范围 然后再排序 排序的时候算平方和就可以了 不用开根号
    ljbha007
        5
    ljbha007  
       2015-08-12 23:39:04 +08:00
    据我了解MongoDB的2dsphere index可以用来给距离排序优化 具体原理手册里没说
    还有个优点是 MongoDB计算的是球面距离 MySQL计算的是平面距离
    如果修改成本不大可以迁移到MongoDB
    现在基本可以当作MySQL用了
    或者仅把坐标数据放mongoDB 然后跨数据库用ID来关联
    相当于是用mongoDB给MySQL做索引
    ETiV
        7
    ETiV  
       2015-08-13 00:11:34 +08:00 via iPhone
    给 geohash 投一票

    经纬度—> geohash字符串

    将GH串、经纬度一起存进数据库,并给字符串加以索引。

    查询的时候用 like wxx% 前缀索引,query 执行起来很快的。这步query是筛选,计算距离跟排序可以放到程序里算。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3080 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:43 · PVG 08:43 · LAX 16:43 · JFK 19:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.