社交平台好友推荐系统设计(类似搜索引擎排名 求指导)
我现在想为社区添加一个功能,就是好友推荐系统
根据某个用户的地区和性别 等自己的属性推荐特定的好友
我以前的做法是
比如登录用户为‘张三’男的 我要推荐相同地区的女的。
SQL语句:
select 地区 into @area,性别 into @sex from 用户表 where 姓名='张三'
select * from 用户表 where 地区=@area and 性别=相反@sex and 姓名 in(最近登录1w用户) limit 300
{最近登录的用户}
这个集合我每半个小时计算的最近登录的1w个用户,然后放到缓存。(这样做虽然不合适,但是如果将用户登录表和用户表join,速度很慢,)
如下。是我以前的做法,发现排序很慢
SQL code
select * from 用户表 left join 登录表 on 用户表.姓名=登录表.姓名 where 地区=@area and 性别=相反的@sex order by 最近登陆日期 DESC limit 300;
得到的结果集合
还需要计算张三和她们之间的年龄差距计算排序( 根据权重排序 )
如 张三 和 王晓燕 的年龄差距为 1岁,权重为 50。
--------------分割线-----------------------------------------------------
我以前这样做每次一个用户发起请求都要执行SQL 和计算,觉得不太合适,所有该有的索引都有了。
我想用sphinx,但是我这个推荐本书就是依据字段属性来区分的,所以觉得也有点不合适,
在这里想问问有什么成熟的方案没有 。
------解决方案--------------------顶贴
------解决方案--------------------算法整体看没什么大问题,建议:
1.{最近登录的用户} 这个集合每半个小时计算最近登录的1w个用户,然后存为表.
2.查询时应避免使用"select *",尽量仅将需要返回的字段列出来.
------解决方案----------------------下面这样查询300条应该会比较快
select TOP(300) *
from 用户表 a
INNER join 最近登录的用户 b
on a.姓名=b.姓名 --姓名创建索引
where a.地区=@area and a.性别=相反的@sex
order by b.最近登陆日期 DESC --最近登陆日期,创建索引