3

我正在使用 PHP 开发一个社交网络类型的网站,我之前做过一次,该网站超出了我的编码能力来跟上,这是几年前的事了,现在我想再次处理这个项目。

基本上在我的网络上有一个friend_friend mysql表,它跟踪谁是谁的朋友,对于每个确认的朋友,数据库中有2个条目是该表:

    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=1657259 ;

然后我有一个包含所有用户信息的用户表,名为friend_reg_user

然后是用户发布的公告表,目的是仅显示与您成为朋友的用户的公告。这是公告表

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=455144 ;

好的,为此我会在friend_friend表上运行查询以获取用户的所有朋友并将它们添加到像这样的字符串 1,2,3,4,5,6 那些将是朋友 ID 号的字符串,然后选择来自公告表,其中公告作者 ID 在我的朋友 ID 列表中

第二种方法是使用 JOINS 一次获取所有这些数据。

我现在的任务终于,一旦网站变得非常大,当数据库中有数百万的朋友记录和公告时,这一切都会变慢,我有什么选择来加快速度?有一个更好的方法吗?此外,我计划更改公告以包含更多内容,而不仅仅是公告,但会像现在的大型网站那样做更多的用户操作,因此它将显示状态更新、博客和公告等等

4

2 回答 2

2

您想要做的事情可能会以多种方式完成。您可以有一个汇总汇总表,它将给定成员的所有关联数据(在此实例中为朋友)组合在一起。

这是一种非常基本的方法,但它可以变得更加复杂。

摘要汇总充当持久缓存机制。您必须通过某种方法保持最新​​状态 - cron 作业、MapReduce 等。您不想在每次需要时计算所有数据 - 相反,定期计算它以便快速准备好。

Memcache 是一个很棒的缓存工具,但它缓存了无论如何都必须在某个时间点计算的数据。不幸的是,Memcache 不是持久的。这意味着如果 memcached servier 或 service 死了,你的数据也会死。

您可以探索一些先进的尖端技术,例如 MongoDB、CouchDB、Project Voldemort 和 neo4j,以获得一些更高效的工具。

我还建议在http://www.elgg.org/上查看基于 PHP 的开源社交网络 Elgg 的源代码

于 2009-07-22T20:13:14.753 回答
0

Facebook 使用 memcached 将 SQL 数据库存储为分布式哈希表。这可能是你最好的选择。

于 2009-07-22T18:13:54.057 回答