我没有面对这个问题,但我总是想到这个问题。当然这只是在复制数据之后,使用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上,我必须转到多个数据库才能获得期望的结果。
答案 0 :(得分:3)
你基本上有两个“碎片树”。您需要按用户和组进行分片。如果你在一个表中尝试这个,那么一种方法总是需要跨所有分片进行查询,如果你有一个有效的方法,这并不是那么糟糕。例如,使用dbShards,您可以跨分片并行运行高效查询(我们称之为“Go Fish”查询)。
还有两个选项需要考虑:
复制表并按用户分片,按组分片。所有读取都将针对单个分片,但您必须写两次。
使用三个表格。由照片id分片的照片桌。 user_photos(user_id,photo_id和其他字段)由用户分片。 group_photos(group_id,photo_id和其他字段)按组分片。
我们经常看到这些情景,这些是客户采用的常用方法。