mysql - 数据库分片如何工作?

标签 mysql database sharding

高层数据库分片的概念是有意义的,分割数据库节点,这样就没有一个节点负责所有持久数据。然而,我对“碎片”的构成有点困惑。它是跨分片复制整个表,还是通常只复制一个表?

例如,如果我们以 Twitter 为例,在最基本的层面上,我们需要一个用户和一个推文表。如果我们根据用户 ID 进行分片,有 10 个分片,则分片函数为 userID mod 10 === 分片位置。但这对于 tweets 表意味着什么?是单独的(单个数据库表)还是每条推文都根据创建该推文的用户 ID 在 10 个表之间划分?

如果是后者,并且假设我们对用户 ID 以外的内容进行分片,例如推文创建的时间戳,那么我们如何知道在哪里查找与用户相关的信息/em> 如果所有表都根据推文创建时间(用户对此没有概念)进行分片?

最佳答案

分片是将数据分割到多个服务器上。如何拆分的选择非常关键,并且可能是显而易见的。

乍一看,按用户 ID 分割推文听起来是正确的。但还有什么其他的东西呢?是否有任何“分组”或者您关心谁“接收”每条推文?

照片共享网站可能最好根据用户 ID 进行拆分,用户照片的元信息也与用户位于同一服务器上。 (实际照片存放在哪里是另一个讨论。)但是你会如何处理那些设法上传一百万张照片的人呢?希望这不会破坏他所在的分片上的磁盘。

一个困惑的案例是电影。你们应该在电影上分开吗?评论?撰写评论的用户?流派?

当然,“mod 10”可以方便地说明用户位于哪个分片上。也就是说,直到您需要第 11 个碎片为止!我更喜欢“散列”和“字典”之间的折衷。首先执行 mod 4096,然后在“字典”中查找将 4096 个值映射到 10 个分片。然后,编写一个强大的工具将一组用户(均具有相同的 mod-4096 值)从一个分片移动到另一个分片。从长远来看,这个工具将非常方便地处理硬件升级、软件升级、王牌大小的高音扬声器或让其他人让路等。

如果您想进一步讨论分片推文,请提供涉及的主要表。另外,如果您需要的话,我对如何为推文发布唯一的 ID 有强烈的意见。 (有一些失败的方法可以做到这一点。)

关于mysql - 数据库分片如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47613435/

相关文章:

c# - 未找到具有不变名称 'MySql.Data.MySqlClient' 的 ADO.NET 提供程序的 Entity Framework 提供程序 - WCF

mysql - MySQL数据库中NULL和NOT NULL是什么意思

elasticsearch - 是否可以找到文档所在的 elasticsearch 分片?

mysql - 如何首次向 SQL 数据库填充多个表

phpMyAdmin:如何安排我的存储过程?

c# - UWP 连接字符串

java - Android 中 java.lang.String 类型的值无法转换为 JSONArray(转发)

elasticsearch - 如何在不影响性能,可扩展性的前提下获得更好的相关性,以及如何避免Elasticsearch的分片效应

MongoDB 分片集合未重新平衡

mysql - 如何在mysql查询中对计算字段进行四舍五入