我没有遇到这个问题,但总是在我的脑海中浮现..当然这只是在复制数据、使用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”查询)。
还有两个其他选项需要考虑:
复制表,一个由用户分片,一个由组分片。所有读取都将针对单个分片,但您必须写入两次。
使用三个表。按照片 ID 分片的照片表。 user_photos(user_id、photo_id等字段)由用户分片。 group_photos(group_id、photo_id和其他字段)按组分片。
我们经常看到这些场景,这些是我们的客户通常采取的方法。
关于MYSQL - 基于组 ID 或用户 ID 的分片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12804971/