一架梯子,一头程序猿,仰望星空!
MySQL性能优化面试题 > 内容正文

水平分表(分库)策略有哪些?


问题简答

水平分表策略指的是表数据根据某种规则拆分成多个子表,水平分库类似,就是根据规则把数据库拆分成多个子库,实际业务场景,分库、分表都是同时进行的,不然无法利用数据库集群提高性能。

问题详解:

1.常见的数据分片策略

无论是分库,还是分表,数据分片策略类似,主要有下面几种:

  1. 范围分片:按照某个连续的范围划分数据,例如按照时间区间或者按照用户ID的范围。
  2. hash分片:按照某种哈希算法计算每条数据的哈希值,然后将相同哈希值的数据存储到同一片中。
  3. 枚举分片:按照某个固定的枚举值划分数据,例如按照地域分片。
  4. 分布式一致性哈希:使用哈希算法将数据分散到一个哈希环上,然后根据物理节点在哈希环上的位置,将数据分配到相应的节点上。

2.各种分片策略的优缺点

2.1.范围分片

优点:

  • 数据顺序存储,能够支持范围查询操作。
  • 易于管理和扩容,可以在数据范围之外新增数据节点。
  • 对于一些范围固定的数据类型,如时间戳,可根据范围进行分片,将数据均匀分布在各节点上。

缺点:

  • 当数据分布不均时,容易导致部分分片集中大量的热点数据,流量都集中到部分数据库实例,造成性能瓶颈。
  • 数据量不可控,某些范围内的数据可能会非常大。

2.2.hash分片

优点:

  • 数据均匀分布在各个节点上,可以有效避免热点数据和数据倾斜问题。
  • 支持对多个字段进行哈希,可避免某个字段值过于集中的问题。

缺点:

  • 不支持范围查询,只能通过全表扫描或者多次查询组合结果的方式进行数据查询操作。
  • 不支持数据按照一定规则顺序存储。
  • 新增或者减少数据库节点,成本较大,需要迁移大量的数据。

2.3.枚举分片

优点:

  • 可以根据枚举值进行分片,将相同枚举值的数据分散到相同节点。
  • 枚举值相对固定,枚举值数量也不多,易于管理。

缺点:

  • 枚举值的数量不可过多,适合按地区划分这种粗粒度的划分数据。
  • 枚举分片通常需要搭配其他分片算法进行二次分片,否则容易出现数据热点问题,例如广东地区数据就上亿,广东地区内部还需要二次拆分数据。

2.4.分布式一致性哈希

优点:

  • hash分片的升级版,解决了hash分片的部分弊端。
  • 支持动态增减节点,节点变化时只需对部分数据进行迁移,不会导致整个数据集的迁移。
  • 数据均匀分布,不会产生热点数据和数据倾斜问题。
  • 支持节点故障的自动处理,保证服务的高可用性。

缺点:

  • 不支持数据范围查询,只能通过全表扫描或者多次查询组合结果的方式进行数据查询操作。
  • 节点变化时需要进行数据迁移,会影响查询性能。

提示:水平分库分表规则,在实际应用场景可以灵活调整和组合,并不是一成不变。