MYSQL - 基于组 ID 或用户 ID 的分片

标签 mysql sharding

我没有遇到这个问题,但总是在我的脑海中浮现..当然这只是在复制数据、使用memcached和分区之后......

如果我有 photo_tbl 并且结构如下

user_id
group_id
date_added
.... and many more 

在用户个人资料上,我们通过运行以下查询来显示用户照片

SELECT ...... FROM photo_tbl WHERE user_id=? order by date_added desc 

在群组页面上,我们通过运行以下查询来显示群组照片

SELECT ...... FROM photo_tbl WHERE group_id=? order by date_added desc 

在这种情况下,如果行数达到数十亿,并且需要在什么键上进行分片,那么您将使用哪个键而不影响上述两个查询的性能..?

如果我的分片键是 user_id ,对于组,我必须访问多个数据库才能获得所需的结果(通过更改应用程序逻辑)..如果它位于用户配置文件的 group_id 上,我必须访问多个数据库才能获取想要的结果。

最佳答案

你基本上有两个“碎片树”。您需要按用户和组进行分片。如果您在单个表中尝试执行此操作,那么一种方法将始终需要跨所有分片进行查询,如果您有一种有效的方法来执行此操作,那么这还不错。例如,使用 dbShards,您可以跨分片并行运行高效查询(我们称之为“Go Fish”查询)。

还有两个其他选项需要考虑:

  1. 复制表,一个由用户分片,一个由组分片。所有读取都将针对单个分片,但您必须写入两次。

  2. 使用三个表。按照片 ID 分片的照片表。 user_photos(user_id、photo_id等字段)由用户分片。 group_photos(group_id、photo_id和其他字段)按组分片。

我们经常看到这些场景,这些是我们的客户通常采取的方法。

关于MYSQL - 基于组 ID 或用户 ID 的分片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12804971/

相关文章:

php - ubuntu MySQL root密码自动更改

mysql - 基于另一列总和的新列

php - 需要在一个字段中搜索两个值Mysql

Heroku 上的数据库分片

database - Hibernate 与不同的数据库对话

json - mongo db.printShardingStatus 命令中 "t"和 "i" block 值的语义

连接中每个表的 MySQL AND 替代方案

php - 从 View 成功插入后MySQL出现一般错误

Mongodb - 分片 - 同时添加多个分片

scala - Spark 按列值分区数据集