如何实现按照距离排序?

2015-08-12 22:30:01 +08:00
 hackingwu

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

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

经纬度—> geohash字符串

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

查询的时候用 like wxx% 前缀索引,query 执行起来很快的。这步query是筛选,计算距离跟排序可以放到程序里算。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/212793

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX