20250218 隨筆 垂直分库分表(Vertical Sharding) 和 水平分库分表(Horizontal Sharding)

垂直分库分表(Vertical Sharding)水平分库分表(Horizontal Sharding) 是数据库拆分的两种策略。它们在大规模数据库优化、分布式架构设计中至关重要,主要用于 降低单库压力、提高查询效率、支持高并发


1. 垂直分库分表(Vertical Sharding)

概念

垂直分库垂直分表 的核心思想是按业务模块或功能拆分数据库,即:

  • 垂直分库(Vertical Database Partitioning):将不同的业务模块拆分到不同的数据库中
  • 垂直分表(Vertical Table Partitioning):在同一个数据库中,将一个大表按字段拆分成多个表

示例

假设有一个 电商系统 ,包含 用户信息、订单、商品、支付 等功能,如果所有数据都存放在一个数据库 ecommerce_db,会导致:

  • 单库压力过大
  • 查询、写入效率下降
  • 影响数据库扩展能力

可以采用 垂直分库

user_db         → 存储用户信息
order_db        → 存储订单信息
product_db      → 存储商品信息
payment_db      → 存储支付信息

不同的业务数据存储在不同的数据库中,每个数据库只处理自己相关的业务,提高效率。


垂直分库 vs. 垂直分表

方式 说明 适用场景
垂直分库 按业务模块拆分数据库,每个库独立存储不同业务数据 业务数据相对独立,不同模块间交互少
垂直分表 在同一个数据库内,将大表按字段拆分成多个小表 单表字段过多,部分字段访问频率低

查询示例

查询用户信息:

SELECT * FROM user_db.users WHERE id = 1001;

查询订单信息:

SELECT * FROM order_db.orders WHERE user_id = 1001;

各个数据库可以独立扩展,互不影响。


优点

分担数据库压力 :不同业务拆分到不同数据库,查询、写入性能提升

不同数据库可独立优化 :如 user_db 读多写少,可优化为读写分离;order_db 写入频繁,可优化为高性能写库

支持不同存储策略 :如 user_db 存 MySQL,payment_db 存 PostgreSQL

缺点

跨库 JOIN 复杂 :无法直接执行 JOIN 查询,需要在应用层处理

事务一致性问题 :跨库事务需要分布式事务(如 TCC、XA)

运维复杂:多个数据库管理、备份、迁移成本增加


2. 水平分库分表(Horizontal Sharding)

概念

水平分库分表 的核心思想是按照数据量进行拆分,即:

  • 水平分库(Horizontal Database Partitioning) :将数据按某个分片键(Sharding Key) 均匀分布到多个数据库
  • 水平分表(Horizontal Table Partitioning) :将数据按分片键分布到多个相同结构的表

示例

假设有一个 orders 表,存储1 亿条订单数据,直接查询会导致:

  • 查询速度变慢
  • 索引过大,影响性能
  • 数据库写入压力过大
水平分库

可以按照 user_id % 4 进行分库

order_db_0: user_id % 4 = 0
order_db_1: user_id % 4 = 1
order_db_2: user_id % 4 = 2
order_db_3: user_id % 4 = 3

查询用户订单:

SELECT * FROM order_db_2.orders WHERE user_id = 1002;

数据分布均匀,每个库的压力降低

水平分表

order_db 内部,将 orders 表按 user_id % 10 拆分为 10 张表

orders_0: user_id % 10 = 0
orders_1: user_id % 10 = 1
...
orders_9: user_id % 10 = 9

查询用户订单:

SELECT * FROM orders_2 WHERE user_id = 1002;

避免单表数据过大,提高查询速度。


水平分库 vs. 水平分表

方式 说明 适用场景
水平分库 Sharding Key 进行数据库拆分,不同数据库存储相同结构的数据 单库容量受限,分片键可均匀分布数据
水平分表 在同一个数据库内,将大表拆分为多个小表 单表数据量过大,查询变慢,索引维护困难

优点

单库压力减少 :数据分布在多个数据库或表,查询、写入速度更快

读写性能提升 :不同库可并行查询、写入 ,提高吞吐量

易于扩展 :可以继续增加数据库或表,支持大规模数据存储

缺点

跨库查询复杂 :需要 UNION ALL 或应用层合并

事务管理难度大 :需要分布式事务,如 TCCXA

数据路由管理 :需要在应用层或 Sharding Proxy 进行数据分片管理


3. 垂直分库分表 vs. 水平分库分表

对比项 垂直分库分表 水平分库分表
拆分方式 按业务模块拆分 按数据量拆分
数据存储 每个库存储不同表 每个库存储相同表,但数据不同
适用场景 业务数据独立,如用户、订单、支付分开 单表数据过大,查询和写入性能受限
查询优化 业务查询独立,无需跨库查询 需要跨库合并查询
事务管理 业务间事务较少 可能涉及跨库事务,需分布式事务
运维难度 需要管理多个数据库 需要管理数据路由、分片规则
扩展性 适合业务扩展,但数据量不均衡 可水平扩展,适合大数据量场景

4. 结合使用

大规模系统 中,通常会 结合垂直分库+水平分库 进行优化。

示例:电商平台

  1. 按业务拆分(垂直分库)

    • user_db(用户数据)
    • order_db(订单数据)
    • payment_db(支付数据)
  2. 按数据量拆分(水平分库)

    • order_db_0, order_db_1, order_db_2...
  3. 按查询优化(垂直分表)

    • users_basic, users_detail

这样既能保证业务独立性 ,又能提升查询和写入性能,适用于大规模系统架构。


总结

  • 垂直分库分表 适用于 不同业务模块独立存储,减少数据库负载
  • 水平分库分表 适用于 大数据量、高并发系统,提高查询和写入性能
  • 大规模系统通常结合使用 ,即 先垂直拆分业务,再水平拆分数据

如果你有具体的业务场景,可以告诉我,我可以给你更详细的架构设计建议!🚀

相关推荐
隔壁老王1561 分钟前
tidb实时同步到mysql
数据库·mysql·tidb
一勺菠萝丶6 分钟前
计算机专业知识【深入理解子网中的特殊地址:为何 192.168.0.1 和 192.168.0.255 不能随意分配】
网络·智能路由器
2501_903238657 分钟前
深入理解 JUnit 的 @RunWith 注解与自定义 Runner
数据库·junit·sqlserver·个人开发
s_fox_14 分钟前
Nginx Embedded Variables 嵌入式变量解析(4)
java·网络·nginx
小光学长17 分钟前
基于flask+vue框架的的医院预约挂号系统i1616(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库
听封25 分钟前
✨ 索引有哪些缺点以及具体有哪些索引类型
数据库·mysql
利瑞华30 分钟前
数据库索引:缺点与类型全解析
数据库·oracle
V+zmm1013433 分钟前
自驾游拼团小程序的设计与实现(ssm论文源码调试讲解)
java·数据库·微信小程序·小程序·毕业设计
ChinaRainbowSea44 分钟前
1. Linux下 MySQL 的详细安装与使用
linux·数据库·sql·mysql·adb
etcix1 小时前
实现一个简单的拉取网络todo app
网络