【发布时间】:2016-08-21 19:22:30
【问题描述】:
我正在开发一个社交 android 应用程序,该应用程序具有与 soundcloud 等相同的追随者系统。
我知道它可以像这样在 MySQL 中轻松实现,这是一个包含关注者和他关注的人的关注表
follower_id following_id
1 2
4 1
6 2
9 6
. .
. .
. .
并使用两个 id 作为主键。
但问题是我们预计网络将增长到数百万用户。
假设只有 100 万用户,平均每个人将拥有 500 名关注者和 500 人。
这将产生一个大约 1,000 * 1,000,000 = 1,000,000,000 条记录的表,并且还会继续增长!
MySQL 能否在这种情况下表现良好?
我可以使用 MongoDB 并像这样存储它
user_id followers following
1 [embedded documents holding followers] [embedded documents holding following]
2 [embedded documents holding followers] [embedded documents holding following]
3 [embedded documents holding followers] [embedded documents holding following]
...
这里的问题不是性能——我认为——而是 mongo 不支持事务,因为对于每个关注我应该将它存储在 2 个文档中!
那么,您认为最好的方法是什么?如果表增长到数十亿行,MySQL 能否表现良好?!!还有其他高效的设计吗?!
【问题讨论】:
-
你问 MySQL 在这种情况下是否会表现良好。当您的 MySQL 模型难以处理您的数据集时,您要么足够富有,可以在专业帮助下轻松解决任何此类问题,要么过于富裕而无法在意。
-
为什么人们认为如果你将不同的软件粘贴到硬件上,它的性能就会不同?这不是我们的宇宙或 IT 的运作方式。如果你有坏的硬件、慢速的磁盘、糟糕的网络——再多的软件都无法解决这个问题。如果您有快速的硬件、快速的磁盘、足够的 RAM - 那么是的,任何软件都可以运行。数十亿条记录对于计算机来说并不多。您在这里担心的是错误的事情,您应该考虑为此分配足够的硬件,而不是使用数据模型进行最小值最大化或考虑 MongoDB。 MongoDB 不会做任何神奇的事情。
-
数十亿行并不是很多(特别是如果它们是 2 个 4 字节整数的元组)。
-
对于每个用户文档,只有 'followers' 和 'following' 是其他用户的 _id 数组。当您想一次性获取所有内容时,请使用 MongooseJS 填充。
-
表(在 MySQL 中)相当简单。但是您将如何处理这些数据?什么
SELECTs?您需要删除“关注”吗?用户是否以任何方式“分组”?
标签: mysql mongodb performance database