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

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


总结

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

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

相关推荐
Zfox_1 分钟前
Redis:Hash数据类型
服务器·数据库·redis·缓存·微服务·哈希算法
陈丹阳(滁州学院)2 小时前
若依添加添加监听容器配置(删除键,键过期)
数据库·oracle
远方16093 小时前
14-Oracle 23ai Vector Search 向量索引和混合索引-实操
数据库·ai·oracle
GUIQU.4 小时前
【Oracle】数据仓库
数据库·oracle
DevSecOps选型指南4 小时前
2025软件供应链安全最佳实践︱证券DevSecOps下供应链与开源治理实践
网络·安全·web安全·开源·代码审计·软件供应链安全
恰薯条的屑海鸥4 小时前
零基础在实践中学习网络安全-皮卡丘靶场(第十六期-SSRF模块)
数据库·学习·安全·web安全·渗透测试·网络安全学习
咖啡啡不加糖4 小时前
Redis大key产生、排查与优化实践
java·数据库·redis·后端·缓存
曼汐 .5 小时前
数据库管理与高可用-MySQL高可用
数据库·mysql
2301_793102495 小时前
Linux——MySql数据库
linux·数据库
喵叔哟5 小时前
第4章:Cypher查询语言基础
数据库