分久必合合久必分
1. 垂直分表 (Vertical Partitioning)
定义:
- 垂直分表 是将一个表中的列分成多个子表,每个子表包含不同的列。每个表中的记录(行)会保持一致,但每个表存储的列不同,通常是根据功能模块或使用频率来进行划分。
应用场景:
- 当某些列的数据访问频繁,而某些列的数据不常用,或者某些列需要特别的处理时,可以采用垂直分表。
示例:
假设有一个用户表:
user_id |
username |
|
phone_number |
address |
profile_pic |
1 |
John |
john@mail.com |
123456789 |
USA |
img1.jpg |
2 |
Alice |
alice@mail.com |
987654321 |
Canada |
img2.jpg |
在垂直分表中,可能会根据访问模式将其分为以下两张表:
- 用户基本信息表:
user_id |
username |
|
1 |
John |
john@mail.com |
2 |
Alice |
alice@mail.com |
- 用户联系信息表:
user_id |
phone_number |
address |
profile_pic |
1 |
123456789 |
USA |
img1.jpg |
2 |
987654321 |
Canada |
img2.jpg |
这样,频繁访问用户基本信息的操作不需要扫描较大的数据集,避免了冗余数据的存储。
2. 垂直分库 (Vertical Sharding or Vertical Database Partitioning)
定义:
- 垂直分库 是指将数据库中的不同模块(表或功能区域)分配到不同的数据库中。每个数据库可能包含不同的业务模块,每个模块的数据存储独立,通常是根据模块的功能划分。
应用场景:
- 当数据库内不同模块之间的业务访问不相同,且某些模块需要单独进行优化时,可以使用垂直分库。
示例:
假设有一个电商系统,数据库包含 用户信息 和 订单信息 两个功能模块。你可以将这两个模块的数据存储在不同的数据库中:
- 用户数据库:存储用户信息,如用户名、邮箱等。
- 订单数据库:存储订单信息、订单详情等。
这样,用户模块和订单模块的数据分开存储,可以针对性地优化不同模块的查询性能,并减少数据库负载。
3. 水平分库 (Horizontal Sharding or Horizontal Database Partitioning)
定义:
- 水平分库 是将一张大表的记录(行)根据某种规则进行拆分,分布到多个不同的数据库中。每个数据库包含的是相同结构的表,但每个数据库中存储的数据是不同的子集。通常是根据某个字段(如用户ID、时间戳等)进行拆分。
应用场景:
- 当表中的数据量过大时,单一数据库无法承载所有数据,或者数据库的查询性能下降时,水平分库可以帮助将数据分散到多个数据库中,从而提升系统的性能和可伸缩性。
示例:
假设有一个用户表,通过 用户ID 来进行水平分库,将用户表拆分成多个数据库:
- 数据库1:存储ID为1-1000的用户数据
- 数据库2:存储ID为1001-2000的用户数据
- 数据库3:存储ID为2001-3000的用户数据
这样,当查询某个ID范围的用户时,只需查询对应的数据库,减少了查询的时间和数据库的负载。
4. 水平分表 (Horizontal Partitioning or Horizontal Table Sharding)
定义:
- 水平分表 是将一张大表的数据根据某种规则(如时间、ID范围等)拆分成多张表。每个表包含相同结构的记录,但存储的数据不同。通常,水平分表会把数据拆分到多个物理表中,每个表的数据存储一部分,所有表的结构一致。
应用场景:
- 当一张表的数据量过大时,通过水平分表可以将数据分散到不同的表中,提升查询效率,并避免表数据过多导致的性能问题。
示例:
假设有一个电商系统的 订单表,每个订单包含订单ID、用户ID、商品ID等字段。通过 按年份进行分表,可以将订单表分成多个小表:
- 订单表_2021:存储2021年的所有订单数据
- 订单表_2022:存储2022年的所有订单数据
- 订单表_2023:存储2023年的所有订单数据
当查询某一年份的订单时,可以直接查询对应的表,而不需要扫描整个订单表,提升查询效率。
总结:
- 垂直分表:将表的列根据功能或使用频率分开存储,优化查询。
- 垂直分库:将不同业务模块的数据存储到不同的数据库中,优化性能。
- 水平分库:将一张大表的数据按某种规则分布到多个数据库中,提升系统性能和可伸缩性。
- 水平分表:将一张大表的数据按某种规则分布到多个物理表中,优化查询和性能。
这四种分库分表方式在大规模系统中都有广泛应用,能够有效地提升系统的扩展性和性能。