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

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


总结

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

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

相关推荐
Aaron158815 小时前
通信灵敏度计算与雷达灵敏度计算对比分析
网络·人工智能·深度学习·算法·fpga开发·信息与通信·信号处理
执笔论英雄15 小时前
【RL]分离部署与共置模式详解
服务器·网络·windows
拍客圈15 小时前
Discuz CC 防护规则
服务器·网络·安全
文章永久免费只为良心15 小时前
一站式综合查询工具:IP、企业信息与网络空间资产高效查询工具
网络·网络协议·tcp/ip
TGITCIC15 小时前
丢掉向量数据库!推理型 RAG 正在重新定义长文档问答的准确边界
数据库·ai大模型·推理·ai搜索·大模型ai·rag增强检索·ai检索
岳来15 小时前
网络小白理解容器网络endpointid
网络·docker·endpoint
若风的雨15 小时前
fence和barrier 的区别
网络
xfhuangfu16 小时前
Oracle AI db 26ai中借助dbca创建pdb的过程
数据库·oracle
heze0916 小时前
sqli-labs-Less-28a
数据库·mysql·网络安全
久违81616 小时前
SQL注入攻击核心技术深度总结
数据库·sql·oracle