【发布时间】:2020-08-17 12:03:38
【问题描述】:
假设我们正在开发一个拥有数十亿用户的 Instagram。我们在多个数据库中(在不同的分片实例/服务器/设备中)对照片表进行分片,并且在照片表中我们有一个createdAt 列。现在用户在应用中打开主页选项卡,应用应该在多个数据库中的照片表中全局(非本地)显示最近的 20 张照片(order by createdAt desc)。 SQL查询应该是怎样的?
我们必须对照片表进行分片,因为数十亿用户会制作数千亿张照片。我们无法在一台服务器的一个数据库中的一张表中存储和提供数千亿张照片。
假设我们有 100 台数据库服务器,一种可能的解决方案是在超过 100 台数据库服务器的照片表上查询 select id from photo order by createdAt desc limit 20。然后在我们的后端,我们得到 20*100 = 2000 张照片行,并在后端(Node.js、Java、Python 等)中按 createdAt 对它们进行排序,只返回前 20 行。
【问题讨论】:
-
也许你不应该抢先分裂。为什么您认为同一服务器上的多个数据库更好?你是如何分片照片表的?因为如果它按用户,它只有一个数据库查询,而且是一个非常基本的查询。你选择 MySQL/Postgres 了吗?
-
@danblack 我并不是说多个数据库在同一台服务器上。 MySQL/Postgres 或其他 RDMS 都很好。请看我的编辑。谢谢!
标签: mysql database postgresql database-design