我正在建设一种服务,一种社交网络,预计将吸引数万亿用户。这些用户将能够关注其他用户。对于这种情况,让我们假设我正在构建Facebook。哈哈!
在每个用户的名字旁边,将有他拥有的追随者的数量。就像这样
SELECT COUNT(*) FROM users_vs_users
WHERE user_followed_id = 'xxx' GROUP BY user_followed;这样做是可行的,但每次重新加载页面并检查数万亿用户时,都会杀死我的服务器。
在users表中为每个用户指定一个名为num_of_followers的字段是否合理,该字段在每次有人被跟踪或未被跟踪时都会更新?
谢谢
发布于 2012-10-22 17:07:34
是。实际上,出于性能原因,您正在进行反规范化。
发布于 2012-10-22 17:18:07
我对此有不同的看法
一些数据库可以使用内存(加上磁盘同步),如Oracle times和MySQL集群
仅对频繁访问的数据使用基于内存的数据库通常会提供很高的性能,这只会使管理“计数”字段的历史记录变得麻烦
另一个大技巧是,除非迫不得已,否则永远不要优化,尝试预测未来几个月的预期流量,而不是几年,然后您可以监控哪些查询实际上正在扼杀性能或进行过多的磁盘访问,然后您将能够根据实际信息而不是猜测来反规范化表
发布于 2012-10-22 17:08:07
在我看来,任何有自尊的DBMS都应该在内部自行执行这样的优化。或者他们已经这么做了?COUNT(*)真的很慢吗?我不知道。
不管怎么说,有何不可呢?只需确保"users_vs_users“和"users.num_of_followers”在任何时候都是同步的。
https://stackoverflow.com/questions/13008005
复制相似问题