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

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


总结

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

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

相关推荐
橘子真甜~3 小时前
C/C++ Linux网络编程15 - 网络层IP协议
linux·网络·c++·网络协议·tcp/ip·计算机网络·网络层
Allen正心正念20254 小时前
网络编程与通讯协议综合解析
网络
bing_feilong4 小时前
ubuntu中的WIFI与自身热点切换
网络
CodeByV5 小时前
【网络】UDP 协议深度解析:从五元组标识到缓冲区
网络·网络协议·udp
JIngJaneIL5 小时前
基于springboot + vue古城景区管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
微学AI5 小时前
复杂时序场景的突围:金仓数据库是凭借什么超越InfluxDB?
数据库
虹科网络安全5 小时前
艾体宝洞察 | 利用“隐形字符”的钓鱼邮件:传统防御为何失效,AI安全意识培训如何补上最后一道防线
运维·网络·安全
廋到被风吹走5 小时前
【数据库】【Redis】定位、优势、场景与持久化机制解析
数据库·redis·缓存
石像鬼₧魂石6 小时前
Kali Linux 网络端口深度扫描
linux·运维·网络
有想法的py工程师7 小时前
PostgreSQL + Debezium CDC 踩坑总结
数据库·postgresql