我这里做的有几个场景 一个是记录用户阅读过哪些文章,另一个场景是 tag 当关系表中记录达到几千万条的时候,读取插入性能都急剧下降,这时候该如何优化呢?
#3 楼 @reducm 垂直拆分是按功能划分,比如新闻和博客都用了 Tag,那么把这两个功能的 Tag 拆开。水平拆分是按照时间段/用户名/其他分区方法把一张表拆开。我不熟拆表,不过看网上的资料说到 SQL 的扩展大都这样。
#4 楼 @ShiningRay 这篇文章被哪些用户读过一定需要查出全部吗?如果不是,可以做一个小的队列缓存。
@ShiningRay 你这种需求属于对于 many-to-many 的中间表做水平切分,并且对双向的 many 都需要查询,常见做法是建立 2 个表,以用户阅读文章为例,一个表根据 user_id 做切分(hash or range shard),另外一个表根据 topic_id 做切分,index 在 2 个表上分开对 user_id 和 topic_id 来建立。创建新记录的时候,需要往这 2 张表都要插入一样的数据。查询的时候,先看是从哪个方向的 many 来查询,然后再做普通的 shard db lookup.