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

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


总结

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

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

相关推荐
你想考研啊8 小时前
oracle导出 导入
数据库·oracle
机器学习之心9 小时前
基于双向时序卷积网络(BiTCN)与支持向量机(SVM)混合模型的时间序列预测代码Matlab源码
网络·支持向量机·matlab
止水编程 water_proof10 小时前
Java-HTTP响应以及HTTPS(下)
网络·网络协议·http
韩立学长10 小时前
基于Springboot的旧时月历史论坛4099k6s9(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
好望角雾眠10 小时前
第四阶段C#通讯开发-9:网络协议Modbus下的TCP与UDP
网络·笔记·网络协议·tcp/ip·c#·modbus
网安小白的进阶之路11 小时前
A模块 系统与网络安全 第四门课 弹性交换网络-5
网络·安全·web安全
8K超高清11 小时前
高校巡展:中国传媒大学+河北传媒学院
大数据·运维·网络·人工智能·传媒
C2H5OH66611 小时前
WebSocket-练习1
网络·websocket·网络协议
狂奔的sherry11 小时前
Socket vs WebSocket
网络·websocket·网络协议
TDengine (老段)11 小时前
TDengine 字符串函数 CONCAT_WS 用户手册
android·大数据·数据库·时序数据库·tdengine·涛思数据