0

我没有遇到这个问题,但我总是想到..当然这只是在复制数据、使用 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 的用户配置文件上,我必须去多个数据库才能获得所需的结果。

4

1 回答 1

3

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

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

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

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

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

于 2012-10-10T15:54:40.447 回答