im消息存储中,内容表和索引表如果需要分库处理,应该按什么字段来哈希? 索引表可以和内容表合并成一个表吗?
这里需要考虑一个问题,我们在查询两个人之间的历史消息的时候是用户维度的查询还是消息维度的查询?如果按消息id哈希,查询两个人之间的历史消息在只有uid的情况下该怎么查呢?
考虑下消息索引表的访问模式,对于索引表最终要求的是尽量能提升获取的效率,所以如果需要有索引表,应该是uid维度的查询会更高效一些。
内容表应该按主键消息ID来哈希做分库分表处理,这样便于定位某一条具体的消息;索引表应该按索引的用户UID来哈希做分库分表处理,这样可以使得当前用户的所有联系人都落在一张表上,减少遍历所有表的麻烦。
索引表可以与内容表合成一张表,好处是显而易见的,能减少拉取历史消息时的数据库IO,不好的地方就是消息内容冗余存储,浪费了空间。