【问题标题】:Database design - Follow System of billions of records数据库设计 - 数十亿记录的跟踪系统
【发布时间】: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


【解决方案1】:
CREATE TABLE Follow (
    er_id INT UNSIGNED NOT NULL  COMMENT 'follower',
    ee_id INT UNSIGNED NOT NULL  COMMENT 'followee',
    PRIMARY KEY(er_id, ee_id),
    INDEX(ee_id, er_id)
) ENGINE=InnoDB;

这样,你可以从 er 到 ee 反之亦然。

借助 MySQL 表结构和 10 亿行和 500 个关注者,SELECT er_id FROM tbl WHERE ee_id = 1234;(反之亦然)通常只需 10-20 毫秒,即使在旋转驱动器上也是如此。

follower_idfollowee_id 的相同性导致我缩短了列名。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-02
    • 2017-03-24
    • 2012-07-23
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多