浅谈分表

275 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

一、前言

分库分表是企业面对高并发,大数据量存储时使用的策略。刚好前阵子有用到过,正好一起梳理一下分表的相关事宜。

二、什么是分库分表

分库分表其实说的范围比较广泛,分库、分表、分库分表分别代表不同的情况,分别是区分多个数据库、同一个数据库分多个表、多个数据库分多张表。这次主要讨论一下分表。

三、分表

什么时候需要分表

分表主要应对数据量大的问题,以MySQL为例当系统中有一张表数据量非常大(百万级),并发并不高,但是查询效率较低,如果添加索引的方式无法优化的情况时,就可以考虑分表了。通过把数据分给多张表,避免查询都在同一张表中,从而提高查询速度。

如何进行分表

顾名思义,把一张表分为多个是需要分表逻辑的,例如我们可以把一年的数据放在张表中,又可以根据用户,同一个用户的数据放在同一张表中,但是不同用户可能不在同一张表中,这就设计分表的策略。

四、分表策略

1.取模

这个分表的策略是需要知道分几个表,如果我们测算数据大概在百万级别,最多千万,我们可以5张表,对于数据的id我们对5取模,数据结果肯定在[0,4]之间,那么我们只需要知道id,就知道此数据存放在哪里。

2. Hash

当我们的数据id不是数字时怎么办呢,例如UUID,我们可以对它去Hash然后取模运算。这里有个坑点,就是Hash可能为负数,所以需要对它取绝对值。

3. 时间

按照数据的创建时间进行分表,例如goods_2022,goods_2023,goods_2024等,也可以一年分多张表。

这几种方式略有不同:

  • 当我们需要经常性一对多查询时,建议使用关联字段Hash取模的方式。例如用户个人收藏夹时,收藏夹表使用用户名进行分表,当我们知道查询的用户时其实已经知道需要查询那张表了。
  • 当我们只是需要查询出单条数据时,就可以通过UUID取模策略,使多张表同时处理请求达到分摊压力的作用。

五、唯一ID生成

如果涉及分库分表离不开唯一Id分生成,也就是分布式系统中唯一ID问题。这里有几个方案供选择。

  • UUID
  • 雪花算法
  • 每个表自增ID

不管是使用什么方式,目的都是为了防止数据Id重复,导致查询结果,操作数据时出现异常。

六、分表的缺点

分表虽然能解决大数量查询问题,但是就是因为分表来了一些问题:

  • 分表之后,查询时都需要带着分表数据,才能知道去哪张表查询。
  • 不能做扫表操作,要不然就是所有分表一起查询。
  • 连表查询时,没有分表字段,会把分表全部都连接一遍。