社交网络php/mysql交友的最佳方式

社交网络php/mysql交友的最佳方式,php,mysql,performance,social-networking,Php,Mysql,Performance,Social Networking,我有一个类似于myspace的社交网络,但我使用PHP和mysql,我一直在寻找最好的方式来显示用户发布的公告 从自己和用户那里,他们被确认为朋友 这涉及3个表 friend\u friend=此表存储谁是谁的朋友的记录 friend\u bulletins=存储公告 friend_reg_user=这是包含所有用户数据(如姓名和照片url)的主用户表 我将在下面发布公告和朋友表方案,我将只发布对用户表重要的字段 --表的表结构friend\u bulletin CREATE TABLE IF

我有一个类似于myspace的社交网络,但我使用PHP和mysql,我一直在寻找最好的方式来显示用户发布的公告 从自己和用户那里,他们被确认为朋友

这涉及3个表

friend\u friend=此表存储谁是谁的朋友的记录 friend\u bulletins=存储公告 friend_reg_user=这是包含所有用户数据(如姓名和照片url)的主用户表

我将在下面发布公告和朋友表方案,我将只发布对用户表重要的字段

--表的表结构
friend\u bulletin

CREATE TABLE IF NOT EXISTS `friend_bulletin` (
  `auto_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(10) NOT NULL DEFAULT '0',
  `bulletin` text NOT NULL,
  `subject` varchar(255) NOT NULL DEFAULT '',
  `color` varchar(6) NOT NULL DEFAULT '000000',
  `submit_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `status` enum('Active','In Active') NOT NULL DEFAULT 'Active',
  `spam` enum('0','1') NOT NULL DEFAULT '1',
  PRIMARY KEY (`auto_id`),
  KEY `user_id` (`user_id`),
  KEY `submit_date` (`submit_date`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=245144 ;
--表的表结构
friend\u friend

CREATE TABLE IF NOT EXISTS `friend_friend` (
  `autoid` int(11) NOT NULL AUTO_INCREMENT,
  `userid` int(10) DEFAULT NULL,
  `friendid` int(10) DEFAULT NULL,
  `status` enum('1','0','3') NOT NULL DEFAULT '0',
  `submit_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `alert_message` enum('yes','no') NOT NULL DEFAULT 'yes',
  PRIMARY KEY (`autoid`),
  KEY `userid` (`userid`),
  KEY `friendid` (`friendid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2657259 ;
将使用的friend_reg_用户表字段 auto_id=这是用户id号 disp_name=这是用户名 pic_url=这是一个缩略图图像路径

  • 公告应该显示我们朋友列表中用户ID发布的所有公告
  • 还应该显示我们自己发布的所有公告
  • 需要很好地扩展,朋友表是几百万行
//1旧方法使用子选择

SELECT auto_id, user_id, bulletin, subject, color, fb.submit_date, spam
FROM friend_bulletin AS fb
WHERE (user_id IN (SELECT userid FROM friend_friend WHERE friendid = $MY_ID AND status =1) OR user_id = $MY_ID)
ORDER BY auto_id
//我在有少量朋友的帐户上使用的另一个旧方法,因为这个方法使用另一个查询 这将返回格式为$str_friend_id=“1,2,3,4,5,6,7,8”的所有好友字符串

我知道这些对性能不好,因为我的网站越来越大,所以我一直在尝试加入

我相信这会得到我所需要的一切,除了它需要被修改以也让我自己发布公告外,当我将它添加到WHERE部分时,它似乎会破坏它,并为每个发布的公告返回多个结果,我认为这是因为它试图 回报我是一个朋友,然后我试着把自己当成一个朋友,这样做不好。

尽管我在这篇文章中的主要观点是,我愿意就完成这项任务的最佳性能方式发表意见,但许多大型社交网络都有类似的功能,只返回朋友发布的项目列表。必须有其他更快的方法????我一直在读到连接对性能不是很好,但是我还能怎么做呢?请记住,我确实使用索引,并且有一个专用的数据库服务器,但我的用户基数很大,没有办法解决这个问题

SELECT fb.auto_id, fb.user_id, fb.bulletin, fb.subject, fb.color, fb.submit_date, fru.disp_name, fru.pic_url
FROM friend_bulletin AS fb
LEFT JOIN friend_friend AS ff ON fb.user_id = ff.userid
LEFT JOIN friend_reg_user AS fru ON fb.user_id = fru.auto_id
WHERE (
ff.friendid =1
AND ff.status =1
)
LIMIT 0 , 30

首先,您可以尝试对数据库进行分区,以便只访问包含所需主行的表。将不太常用的行移动到另一个表中

联接可能会影响性能,但从我所看到的情况来看,子查询并没有更好。尝试重构查询,这样就不会一次提取所有数据。看起来有些查询可以在应用程序的其他地方运行一次,结果可以存储在变量中,也可以缓存


例如,您可以缓存为每个用户连接的朋友数组,并在运行查询时仅引用该数组,并且仅在添加/删除新朋友时更新缓存


它还取决于您的系统结构和代码体系结构-您的备份可能不完全在数据库中。

“您可以缓存每个用户连接的朋友数组,在运行查询时仅引用该数组,并且仅在添加/删除新朋友时才更新缓存。”实际上,我一直在寻找一种切实可行的方法,我愿意接受任何建议,正如你提到的,我可以在添加朋友时更新此缓存,但当其他用户添加我时,这将更加困难,但我相信这可以解决。至于缓存一组好友,我不知道如何才能做到这一点,有些用户有多达50000多个好友
SELECT fb.auto_id, fb.user_id, fb.bulletin, fb.subject, fb.color, fb.submit_date, fru.disp_name, fru.pic_url
FROM friend_bulletin AS fb
LEFT JOIN friend_friend AS ff ON fb.user_id = ff.userid
LEFT JOIN friend_reg_user AS fru ON fb.user_id = fru.auto_id
WHERE (
ff.friendid =1
AND ff.status =1
)
LIMIT 0 , 30