Home  >  Q&A  >  body text

php - 几百万数据的群聊要怎样分表?

有两张表,群表,群成员表,现在成员表比较大想进行分表

想到有两种分表方法,按人分或按群分

如果按人分,查询哪个人加入过哪个群很容易,但查询群有多少人报名就要用UNION去查了

如果按群分,查询群有多少人报名很容易,但查询哪个人加入过哪个群就要用UNION去查了

请问有什么好的方案可以令上面两个需求都可以高效查询,分表是为了减少查询压力,但用UNION又会增加查询压力,违背分表的初衷了

高洛峰高洛峰2655 days ago711

reply all(4)I'll reply

  • PHPz

    PHPz2017-04-11 10:21:08

    推荐使用hash方式分表,根据用户id进行hash分表,假设你有1亿的聊天记录,那么不到100张表也够了。

    reply
    0
  • 迷茫

    迷茫2017-04-11 10:21:08

    我觉得是不是改动一下群表,把用户队列值写进去:'1,2,3' 然后成员表按用户id范围分一下表
    不然的话你两个操作都要效率高 我觉得有点矛盾啊

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-11 10:21:08

    建立两个关联表来统计,报名表和用户加群表。

    reply
    0
  • 怪我咯

    怪我咯2017-04-11 10:21:08

    如果id分布均匀,那就按照uid hash分表,没什么问题,查询用户加入过哪些群也很简单。查询群有多少人报名就要用UNION去查了。如果仅仅是想查多少人报名,比较容易解决:

    • 可以改下表的设计,在群表加入一个用户数的字段也可以解决问题, 查询的时候直接查群表就好了;

    • 或者采用redis的计数器来存群人数。

    当然,还是还有一个问题没法解决,就是如果你想查群成员列表,还是得用UNION去查了。

    我也想知道怎么解决,题主如果有解决方案了,麻烦分享一下。多谢。

    reply
    0
  • Cancelreply