我现在要做一个按照距离排序的,数据库是MySQL,如果我每次请求列表都从数据库中计算两个点的距离(经纬度)计算,一定相关慢?请教一下一般大家都是如何实现?
我的想法是对备份数据到redis中,每一次请求来,以请求的经纬度做key,去之前备份的redis数据中做一次排序,然后再缓存到redis中,以后的请求如果和其中的key做比较,如果相聚1km则使用缓存的。
1
wy315700 2015-08-12 22:30:49 +08:00
geohash
|
2
Andiry 2015-08-12 22:42:32 +08:00 via Android
把地图划分成方块,然后按方块距离排序,有精确要求的话方块内部再排序
|
3
publicID001 2015-08-12 23:00:52 +08:00
PgSQL大法豪
|
4
ljbha007 2015-08-12 23:28:47 +08:00
缓存并没有叼用 除非目标点坐标重复的很多 而且是一点都不能偏
我看了下MySQL的Spatial Index也只是用来查找确切值 不能用来计算距离 最好的办法也只有先限定范围 然后再排序 排序的时候算平方和就可以了 不用开根号 |
5
ljbha007 2015-08-12 23:39:04 +08:00
据我了解MongoDB的2dsphere index可以用来给距离排序优化 具体原理手册里没说
还有个优点是 MongoDB计算的是球面距离 MySQL计算的是平面距离 如果修改成本不大可以迁移到MongoDB 现在基本可以当作MySQL用了 或者仅把坐标数据放mongoDB 然后跨数据库用ID来关联 相当于是用mongoDB给MySQL做索引 |
6
ljbha007 2015-08-12 23:40:56 +08:00
|
7
ETiV 2015-08-13 00:11:34 +08:00 via iPhone
给 geohash 投一票
经纬度—> geohash字符串 将GH串、经纬度一起存进数据库,并给字符串加以索引。 查询的时候用 like wxx% 前缀索引,query 执行起来很快的。这步query是筛选,计算距离跟排序可以放到程序里算。 |