用mysql查找附近的人或商店与存储优劣选择

发布于:2014-08-29 10:57:32 - 查看:1416次

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格的距离,而且有误差,正方形取代圆形,如果欲找圆形还需要筛选。