分库分表

分库分表模式:

1. 垂直分库:

垂直份库指的是按照业务模块维度将原本集中在一个数据库中的多个表,拆分到多个独立的数据库中。每个数据库只负责一个或几个功能相近的业务模块,例如用户库、订单库、商品库等。

本质上,垂直拆库是将一个“通用大库”拆解成“多个专业小库”,使每个库专注于一类业务领域。

2. 垂直分表

垂直分表指的是将一个表中字段较多、关注点不同的列按功能拆分成多个表,通常以主键(如用户ID)为关联字段,拆分后的表仍具有一对一或一对多的关系。

举例:将原 user 表拆成 user_base(基本信息)和 user_detail(扩展信息)两个表。

3. 水平分库

水平分库是指:将表的数据按某种规则分散到多个数据库实例中,每个库保存部分数据,库中包含同样结构的表。

例子:将订单数据按时间范围分别存入 order_db_2023order_db_2024 两个数据库中。

4. 水平分表

水平分表是指:将一个表中的数据行按照某种规则(如用户ID、时间等)拆分到多个结构相同的表中,这些表通常仍存在于同一个数据库实例中

例子:将 order 表按用户 ID 拆成 order_0, order_1, order_2 等,每张表存储部分数据。

什么场景分库?

  1. 客户端需要更多的数据库连接池保证并发
  2. 数据量过多,需要提升数据库容量性能

什么场景分表?

  1. 某个表的数据量过大
  2. 单表存在较高的写入场景,可能引发行锁竞争。
  3. 当表中包含大量的 TEXT、LONGTEXT 或 BLOB 等大字段。

什么场景分库分表?

1. 高并发写入场景

当系统需要承受大量的并发写入请求时,单个数据库往往难以支撑持续的写入压力,容易成为性能瓶颈。此时,可以根据一定的分片规则(如按用户ID、订单号哈希等)将写入请求分散到多个数据库中,让每个库只处理一部分写入任务,从而显著提升整体的写入性能

2. 海量数据存储场景

随着系统运行时间的增长,数据量会不断积累,单表或单库的数据规模可能变得庞大,导致查询性能下降、维护成本升高。这种情况下,可以通过分表将数据按规则(如时间、范围、哈希)拆分成多个表进行存储,进而降低单表的数据量,提升查询效率和可维护性

如何选择分片键?

    1. 数据分布均匀性

    分片键应具备良好的离散性,能够将数据均匀地分散到各个库或表中,避免某些分片聚集过多数据,造成访问热点或负载不均的问题。

    2. 与业务的关联性

    分片键最好与具体的业务逻辑紧密相关,这样可以在查询或更新数据时尽量定位到单个分片,减少跨库跨表操作的发生,提升系统效率并降低复杂度。

    3. 分片键的稳定性

    一旦确定了分片键,应确保其在整个数据生命周期中是不可变的。如果分片键频繁变更,可能会导致数据迁移、分片失效等问题,影响系统稳定性和性能。

分库分表算法?

分库分表的算法并没有统一标准,而是需要根据具体的业务需求来灵活选择。在实际应用中,业界常用的主要有两类:

    1. Hash取模分片算法

    对指定的分片键进行 哈希计算并取模,根据结果将数据均匀分配到不同的库或表中。适用于分布均匀、查询性能稳定,适合对数据分布要求较高的高并发场景。

    2. 时间范围分片算法

    按照数据中的时间字段(如创建时间)进行分片,比如按月、按季度、按年划分数据存储区间。适用于数据有明显时间特征的场景,如订单、日志等便于进行按时间的范围查询的数据。

    如果有写的不对或者需要补充的地方,欢迎各位大佬指正!

#运营每日一题##牛客创作赏金赛#
全部评论
如果有写的不对或者需要补充的地方,欢迎各位大佬指正!
点赞 回复 分享
发布于 今天 00:06 江西

相关推荐

认真搞学习:这个真喷不了,你是我见过最美的牛客女孩
点赞 评论 收藏
分享
ResourceUtilization:四六级不愧是大学最有用的证之一
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客企业服务