用mysql查找附近的人或商店与存储优劣选择
发布于:2014-08-29 10:57:32 - 查看:2365次
from: http://user.qzone.qq.com/46042031/2
开源方式查找附近的人或商店,目前方式已足够多,原理是查找以当前位置为圆心,R距离为半径范围内的人或店铺。目前已有不少方法,大概有如下几种:
1.mysql,mysql的方式有两种:
1)自定义mysql扩展函数,通过传入当前位置坐标和坐标字段来计算,
代码如下:BEGINDECLARE RAD DOUBLE;
DECLARE EARTH_RADIUS DOUBLE DEFAULT 6378137;
DECLARE radLat1 DOUBLE;
DECLARE radLat2 DOUBLE;
DECLARE radLng1 DOUBLE;
DECLARE radLng2 DOUBLE;
DECLARE s DOUBLE;
SET RAD = PI() / 180.0;
SET radLat1 = lat1 * RAD;
SET radLat2 = lat2 * RAD;
SET radLng1 = lng1 * RAD;
SET radLng2 = lng2 * RAD;
SET s =ACOS(COS(radLat1)*COS(radLat2)*COS(radLng1-radLng2)+SIN(radLat1)*SIN(radLat2))*EARTH_RADIUS;
SET s = ROUND(s * 10000) / 10000;RETURN s;
END
2)通过mysql的空间索引。使用point等方式。
2.其他的方式有sphinx(Lucene、solr也有)、mongodb、结合redis使用geohash。
http://blog.sina.com.cn/s/blog_6602680d0101qj4j.html
3.优劣对比:数据量较小时性能问题还不大,mysql是实时与其他坐标实时计算,
时间复杂度很高。需要数据库大量计算。适合业务量较小的应用,数据量大绝对不可取,
一般机器高于5w性能将指数级下降。sphinx适合附近商铺商家等位置坐标不易变化的事物的查找,
因为用spinx就意味着缓存。如果查附近的人或者计算动态变化的事物的距离,则不可取。
好处是性能非常高,支持分布式,如果是查附近商家,则是不二选择。
mongodb则是查找附近人的利器,据说陌陌用的是mogodb来计算附近人,
貌似效率不低。链接上有demo没有在实际应用是用过。
mogodb很灵活。geohash结合redis也能用,缺点很明显,
只能查附近最多8格的距离,而且有误差,正方形取代圆形,如果欲找圆形还需要筛选。