mysql - 数据库设计——Follow System of billions of records

标签 mysql mongodb performance database

我正在开发一个社交 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 不支持事务,因为对于以下每个action 我应该将它存储在 2 个文档中!

那么,您认为最好的方法是什么?如果表增长到数十亿行,MySQL 会表现良好吗?!!还有其他高效的设计吗?!

最佳答案

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 的相同性导致我缩短了列名。)

关于mysql - 数据库设计——Follow System of billions of records,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36890773/

相关文章:

python - 在 Flask 中实现 MongoDB 搜索引擎 API

mongodb - 如何修复 'Unrecognized expression $round',同时使用 mongodb $ 和 $lookup 条件将其应用于管道中的存储数据

Java:高效存储 boolean 值[32]?

ruby - 现代计算机的功能是否不足以处理字符串而无需使用符号(在 Ruby 中)

java - 创建新变量与重用旧变量哪个更快?

mysql - 如何快速克隆mysql innodb数据库

javascript - DataTables 不会加载 AJAX 和 MYSQL

mysql - UNION ALL 的派生表和大量数据库的索引使用情况

node.js - 如何在重置密码时使用新密码更新密码

PHP 返回数组或-1