2 zenghuijava zenghuijava 于 2013.12.10 15:22 提问

类似微信查找附近人分页排序问题

目前我想到的查找附近人方案有两种:
1,直接通过sql语句求的距离,然后按距离排序,保存在list中,序列化json格式返回给客户端
SELECT LEFT((2 * ASIN(SQRT(POW(SIN((RADIANS(40.044058)-RADIANS(a.latitude))/2),2) + COS(RADIANS(40.044058))*COS(RADIANS(a.latitude))*POW(SIN((RADIANS(116.302549) - RADIANS(a.Longitude))/2),2)))* 6378.137),4) AS distance,a.userid,wd.username,wd.nickname,a.latitude,a.Longitude,a.areacode,ws.stepdaywanbua,ws.minwalkdate,a.sex FROM
(SELECT userid,Longitude,latitude,areacode,sex FROM wanbu_member_profile b WHERE b.areacode LIKE 'uzu%')a
LEFT JOIN wanbu_data_user wd ON a.userid=wd.userid LEFT JOIN wanbu_stat_user ws ON

a.userid=ws.userid WHERE a.userid NOT IN (SELECT friendid FROM wanbu_home_friend WHERE userid='6154' ) AND a.userid<>'6154' HAVING distance <= 10
order by distance ASC
2,通过sql语句查询出经度纬度,然后将经度纬度传到算距离函数中,求的距离,一起保存在list中,然后通过list中某个属性值排序,得到最终结果,序列化json格式,返回给客户端。
SELECT a.userid,wd.username,wd.nickname,a.latitude,a.Longitude,a.areacode,ws.stepdaywanbua,ws.minwalkdate,a.sex FROM(SELECT userid,Longitude,latitude,areacode,sex
FROM wanbu_member_profile b WHERE b.areacode LIKE 'uzu%' order by b.areacode desc )a LEFT JOIN wanbu_data_user wd ON a.userid=wd.userid LEFT JOIN wanbu_stat_user ws ON a.userid=ws.userid WHERE a.userid NOT IN (SELECT friendid FROM wanbu_home_friend WHERE userid='104095' ) AND a.userid<>'104095' limit 0,20 ;

方案1存在性能消耗问题严重,12个线程,请求。对数据库压力是1200%多。耗时10000多ms
方案2性能有提升,对数据库压力降低为900%。耗时1000多ms.

但是目前遇到问题是:如果提升性能,使用方案二。客户端分页的话,就没有办法正确的排序。

1个回答

u010006309
u010006309   2015.11.27 15:08

所以排序方案要怎么设计呢

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!