什么是数据库的分库、分表、分片?他们都有什么作用?

如何进行数据库分库分表 它通过将原本数据量大的数据库拆分成多个单独的数据库,将原本数据量大的表拆分成若干个数据表,使得单一的库、表性能达到最优的效果(响应速度快),以此提升整体数据库性能。将垂直分库和水平分表相结合,按照业务功能将数据库拆分为多个独立的数据库,并对每个数据库中的表进行水平切分。在拆分数据库的同时,还对每个数据库中的表进行水平切分,将一张表的数据拆分为多个小表进行存储。根据需求分析结果,设计具体的分库分表方案,包括切分键的选择、数据的映射关系、数据迁移策略等。:游标有多种类型,包括只读的、可更新的、可滚动的等。 阅读详情

这是一个非常核心且重要的问题!在高并发、大数据量的系统中,单台数据库服务器会成为性能瓶颈。为了解决这个问题,我们引入了 分库、分表、分片 等分布式数据库技术。

下面我将为你详细解释:

  • 什么是 分库、分表、分片
  • 他们之间的关系
  • 各自的作用
  • 解决的核心问题
  • 实际开发中的应用场景

🧩 一、基本概念定义

术语英文定义
分库Database Sharding / Horizontal Partitioning将一个大数据库拆分成多个独立的数据库(可以位于不同服务器)
分表Table Partitioning将一张大表拆分成多个结构相同或不同的子表
分片Sharding广义概念,指将数据水平切分到多个数据库或表中,是“分库”和“分表”的统称

🔍 简单理解:

  • 分片 = 分库 + 分表
  • 它们都是为了实现 水平扩展(Horizontal Scaling)

🎯 二、他们都是为了解决什么问题?

❌ 单库单表的瓶颈

当系统发展到一定规模时,单台 PostgreSQL 或 MySQL 会面临以下问题:

问题说明
💾 存储瓶颈单表数据量过大(如 1 亿条),磁盘空间不足
🐢 查询性能下降索引变大,SELECT 变慢,ORDER BY、GROUP BY 耗时增加
🔗 连接数限制数据库连接池耗尽,应用无法获取连接
📈 写入瓶颈高频 INSERT 导致 WAL 写满、锁竞争严重
🔄 维护困难VACUUM、ANALYZE、备份恢复耗时极长

⚠️ 典型场景:用户表 5000 万条、订单表每天新增 100 万条 → 单机扛不住!


✅ 三、分库、分表、分片详解

1. 🔹 分库(Database Sharding)

📌 定义:

将一个数据库按某种规则拆分成多个独立的数据库,每个库可以部署在不同的物理服务器上。

🎯 作用:
  • 分散 I/O 压力
  • 提升整体吞吐量
  • 实现数据库的水平扩展
🧩 示例:

假设你有 1 亿用户,可以按 user_id % 2 拆成两个库:

db0(user_id 为偶数) → server1:5432
db1(user_id 为奇数) → server2:5432
✅ 优点:
  • 数据分散,降低单库压力
  • 可独立扩展硬件资源
  • 故障隔离(一个库挂了不影响另一个)
⚠️ 缺点:
  • 跨库查询复杂(如统计所有用户)
  • 事务难以跨库支持
  • 需要中间件或应用层路由

2. 🔹 分表(Table Partitioning)

📌 定义:

将一张大表按某种规则拆分成多个子表,这些子表可以属于同一个库,也可以分布在不同库中。

🧩 类型:
类型说明示例
水平分表按行拆分,每张表结构相同,数据不同orders_2024, orders_2025
垂直分表按列拆分,不同表存储不同字段user_base, user_profile
✅ 水平分表示例:
-- 按时间分表
orders_2024
orders_2025
orders_2026

-- 按 ID 分表
orders_0  (id % 4 = 0)
orders_1  (id % 4 = 1)
...
✅ 优点:
  • 减少单表数据量,提升查询性能
  • 可针对不同表设置不同索引、存储策略
  • PostgreSQL 支持原生 表分区(Partitioning)
⚠️ 缺点:
  • 需要应用或中间件路由
  • 跨表查询需合并结果

3. 🔹 分片(Sharding)

📌 定义:

分片是“分库”和“分表”的统称,是一种将数据水平切分到多个数据库节点的技术。

✅ 分片 = 分库 + 分表 + 路由逻辑

🎯 核心思想:

把大问题拆成小问题,让多个数据库一起承担压力。

🧩 分片键(Sharding Key):

决定数据如何分布的关键字段,如:

  • user_id
  • order_id
  • tenant_id(多租户系统)
📈 路由方式:
方式说明
取模(Mod)shard = id % N,简单但扩容难
范围分片id < 1000万 → shard0,适合时间序列
一致性哈希扩容时数据迁移少,适合缓存、分布式系统

🔗 四、分库、分表、分片的关系

                     +------------------+
                     |     分片 (Sharding)     |
                     +------------------+
                               |
           +-------------------+-------------------+
           |                                       |
   +-------v--------+                   +----------v----------+
   |     分库         |                   |       分表             |
   | (Database Split) |                   | (Table Partitioning)   |
   +------------------+                   +----------------------+
           |                                       |
   按数据库拆分                           按表结构拆分
   (可跨服务器)                         (可在同库或跨库)

✅ 实际项目中,分片通常同时包含分库和分表:

  • 先分库(如 db0, db1)
  • 每个库内再分表(如 orders_0, orders_1)

✅ 五、他们解决了哪些问题?(总结)

技术解决的问题适用场景
分库单库 I/O、连接数、存储瓶颈高并发读写、大数据量
分表单表数据量过大、查询慢日志、订单、消息表
分片单机无法扩展、性能瓶颈超大规模系统(如电商、社交)

🧪 六、实际开发中的应用场景

场景 1:用户中心系统(按 user_id 分片)

用户ID:1001 → 路由到 db0.user_0
用户ID:1002 → 路由到 db1.user_1
  • ✅ 优点:用户数据隔离,查询快
  • ✅ 工具:ShardingSphere、MyCat

场景 2:订单系统(按时间分表)

CREATE TABLE orders_2024 PARTITION OF orders
    FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');
  • ✅ PostgreSQL 原生支持
  • ✅ 查询某年订单时,只扫描对应分区

场景 3:多租户 SaaS 系统(按 tenant_id 分库)

tenant_a → db_tenant_a
tenant_b → db_tenant_b
  • ✅ 数据隔离性强
  • ✅ 可为大客户分配独立数据库

场景 4:日志系统(按时间分库 + 分表)

log_db_2024 → log_01, log_02, ..., log_12
log_db_2025 → log_01, log_02, ..., log_12
  • ✅ 冷热数据分离
  • ✅ 老数据可归档或删除

🛠️ 七、实现方式对比

方式说明优点缺点
应用层分片在 Java 代码中手动路由灵活,控制力强侵入性强,维护难
中间件分片
(如 ShardingSphere)
透明路由,兼容 JPA/MyBatis无侵入,功能强大增加运维复杂度
数据库原生分区
(PostgreSQL Partitioning)
使用 PARTITION BY RANGE/LIST性能好,管理方便不支持跨分区事务

✅ 八、推荐做法(Java 开发者)

建议说明
✅ 小项目先不分片单库优化(索引、SQL、读写分离)优先
✅ 中等项目用 PostgreSQL 分区表原生支持,简单高效
✅ 大项目用 ShardingSphere分库分表 + 读写分离一体化
✅ 分片键要选好选高频查询字段,避免热点数据
✅ 避免跨分片查询如必须,用“应用层聚合”
✅ 监控分片均衡性避免某个库数据过多(数据倾斜)

✅ 九、总结:一句话搞懂三者区别

术语一句话解释
分库把一个数据库拆成多个数据库,放不同服务器上
分表把一张大表拆成多张小表,结构相同或不同
分片是分库和分表的统称,目的是水平扩展数据库

🎯 终极目标:让数据库像“集群”一样工作,而不是“单兵作战”。

Mybatis Plus 数据分片-水平分库分表策略 在实际应用中,需要根据业务需求和数据量的大小,选择合适的分片键和分片规则,以达到提高数据库性能和可扩展性的目的。在使用MyBatis Plus进行数据分片时,需要谨慎处理跨库跨表的查询,注意数据迁移和扩容的问题,以确保整个数据分片系统的稳定性和可维护性。数据分片是一种处理大量数据的有效策略,但在实施过程中需要注意一些关键的事项,以确保分片系统的性能、稳定性和可维护性。分片规则的设计直接关系到数据分片的正确性,以及每个分片的数据能否被正确路由到相应的库和表中。选择合适的分片键是数据分片中至关重要的一步。 阅读详情

相关推荐

【分库分表】基于mysql+shardingSphere的分库分表技术

分库分表是一种场景解决方案,它的出现是为了解决一些场景问题的,哪些场景喃?单表过大的话,读请求进来,查数据需要的时间会过长读请求过多,单节点IO压力太大,IO压力太大会造成什么?可能会造成IO阻塞,造成响应速度变慢。分库分表是指的两种维度,一种维度是分库,另一种维度是分表。分的话有两种分法,一种是水平分,另一种是垂直分。水平分是指将数据分为多段,一个服务器节点上存放一段,读写的时候走自己要的那一段所在服务器上。一段也叫一个分片(sharding)

m0_74823239的博客 1557

数据库分片(Sharding):分表+分库+分片+分区

在字段很多的情况下(例如一个大表有100多个字段),通过"大表拆小表",更便于开发与维护,也能避免跨页问题,MySQL底层是通过数据页存储的,一条记录占用空间过大会导致跨页,造成额外的性能开销。但是如果取得页数很大,情况则变得复杂很多,因为各分片节点中的数据可能是随机的,为了排序的准确性,需要将所有节点的前N页数据都排序好做合并,最后再进行整体的排序,这样的操作时很耗费CPU和内存资源的,所以页数越大,系统的性能也会越差。表中ID增长的步长是库的数量,起始值依次错开,这样能将ID的生成散列到各个数据库上。

qq_28097205的博客 3269

边缘计算【智能+安全检测】系列教程--使用OpenCV+GStreamer实现真正的硬解码,完全消除马赛克

通过现有博客的GStreamer的解码方式解码,大多情况应该存在上图马赛克的问题,请勿紧张,其实上述url并没有调用硬件解码,后面有调用硬件解码的ULR,我们来在接下来的介绍中释获。通过RTSP协议连接海康威视摄像头将图片送入AI推理,发现OpenCV的VideoCapture使用的是软解码大量消耗了cpu的资源,并无法做到实时数据处理存在5秒钟的延时。只能把解码这部分送到硬件解码器去处理分摊掉cpu的压力,

Starry-SkyJing的博客 2426

数据库分区、分表、分库、分片

一、分区的概念 数据分区是一种物理数据库的设计技术,它的目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。 分区并不是生成新的数据表,而是将表的数据均衡分摊到不同的硬盘,系统或是不同服务器存储介子中,实际上还是一张表。另外,分区可以做到将表的数据均衡到不同的地方,提高数据检索的效率,降低数据库的频繁IO压力值,分区的优点如下: 1、相对于单个文件系统或是硬盘,分区可以存储更多的数据; 2、数据管理比较方便,比如要清理或废弃某年的数据,就可以直接删除该日期...

liuyuehui的专栏 1058

最佳量化交易的计算机操作系统

本文在Creative Commons许可证下发布   我经常被问到的一个问题是:用哪种计算机操作系统和计算软件进行量化交易的理论研究和代码实现?   我想把这个问题简化,从挑选的计算软件和计算库来反推最佳使用的计算机操作系统。简而言之,就是在本文撰写的时候而言,如果你想进行基于任何严肃的数学理论和金融量化交易研究理论,这里特指机器学习或者深度学习。并且需要在本地研究机器上使用桌面版本,...

evilqliang的博客 2306

用Python玩转ROS机械臂:YOLO目标检测+MoveIt!自动抓取仿真教程

本文详细介绍了如何利用Python集成YOLO目标检测与ROS的MoveIt!运动规划库,实现机械臂的智能抓取仿真。通过Gazebo仿真环境,从视觉感知、坐标转换到运动规划与执行,构建了一套完整的自动化抓取系统,为机器人视觉抓取应用提供了可复现的实践方案。

ppp33的博客 552

分库分表-分片键

分片键算法:分片键决定了数据会被分布在哪个分片,原理就是根据分片键的值计算出数据所分布的分片ID计算的过程就是分片键算法,即 f(shardKey) = shardID,常见的算法有三种。

weixin_37862824的博客 677

【故障排查】telnet连接失败:端口23不可达的深度分析与解决方案

本文深度解析telnet连接失败时端口23不可达的常见原因与解决方案。从快速自查目标地址、端口到服务端排查,涵盖服务状态检查、防火墙配置及安全组设置,并提供进阶诊断工具与抓包分析方法。文章强调telnet协议的安全风险,建议在生产环境中改用SSH等加密协议进行远程管理。

weixin_28323057的博客 392

Mysql - 分片分库分表分区概论

随着业务的增长和数据量的膨胀,传统的单一数据库架构可能无法满足现代应用的性能和可靠性需求。数据库的扩展策略通常分为两大类:垂直扩展(Vertical Scaling)和水平扩展(Horizontal Scaling)。

yueerba126的博客 3879

[Linux项目实践] LCD Panel的硬件分析及调试

LCD硬件分析 项目使用3.5” TFT-LCD并且支持触摸控制。LCD的硬件可从几个方面学习:1)查看LCD的硬件连线。2)查看数据手册了解寄存器的控制。3)查看LCD DATASHEET了解硬件操作 1)LCD硬件连线 在图中有33个引脚,22根数据引脚和9根控制引脚。 LCD的工作原理:像素点是从左至右,从上至下逐个显示,LCD控制寄存器会从从内存中的framebuffer通

Terry_Yuan的技术专栏 3022

【06】C#入门到精通——C# 多个 .cs文件项目 同一项目下添加多个 .cs文件

本文介绍了如何将C#游戏开发中的代码从单个.cs文件拆分到多个.cs文件中,以提升代码的可维护性和可读性。文章演示了在Visual Studio中创建Hero类和ShowInfo类的具体步骤:通过右键项目名添加新建类,将原有代码分别剪切到对应的类文件中,并自动生成命名空间。拆分后需要在Program.cs中通过"using"指令引用这些类,最后通过运行测试验证功能正常。这种模块化代码组织方式能有效解决单一文件代码过长、结构混乱的问题。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1135

MySql分表、分库、分片和分区知识

一、前言     数据库的数据量达到一定程度之后,为避免带来系统性能上的瓶颈。需要进行数据的处理,采用的手段是分区、分片、分库、分表。 二、分片(类似分库)      分片是把数据库横向扩展(Scale Out)到多个物理节点上的一种有效的方式,其主要目的是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题。Shard这个词的意思是“碎片”。如果将一个数据库当作一块大玻璃,将...

芭蕉扇 5万+

23种设计模式-享元(Flyweight)设计模式

软考中级-软件设计师 享元设计模式

片言可决讼,半纸能缚龙 3223

什么是分库分表?为什么需要分表?什么时候分库分表

分库分表是在海量数据下,由于单库、表数据量过大,导致数据库性能持续下降的问题,演变出的技术方案。分库分表是由分库和分表这两个独立概念组成的,只不过通常分库与分表的操作会同时进行,以至于我们习惯性的将它们合在一起叫做分库分表。通过一定的规则,将原本数据量大的数据库拆分成多个单独的数据库,将原本数据量大的表拆分成若干个数据表,使得单一的库、表性能达到最优的效果(响应速度快),以此提升整体数据库性能。预定义算法是事先已经明确知道分库和分表的数量,可以直接将某类数据路由到指定库或表中,查询的时候亦是如此。

m0_67544708的博客 4347

mojoPortal 路径穿越漏洞复现(CVE-2025-28367)(附脚本)

 在 mojoPortal CMS 版本 <=2.9.0.1 中发现了一个导致 ViewState 反序列化的目录遍历漏洞。通过利用此问题,未经身份验证的攻击者可以泄露 Web 根目录中的敏感文件,包括应用程序的文件。此配置文件包含用于验证和解密 ViewState 数据的文件。知道此密钥后,网络攻击者可以构建恶意 ViewState 有效负载,从而导致在底层服务器上执行远程代码。(CVE-2025-28367)

iSee857的博客 500

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

数据库中的分表,分库,分区与分片的区别与联系

分区并不是生成新的数据表,而是将表的数据均衡分摊到不同的硬盘,系统或是不同服务器存储介子中,实际上还是一张表。分区可以做到将表的数据均衡到不同的地方,提高数据检索的效率,降低数据库的频繁IO压力值。它不仅能够应对规模的缩放挑战,还能够处理分片带来的复杂性,同时在处理大量数据时保持卓越的性能。基于目录的分片:维护一个查找表,将特定的键直接映射到特定的分片。分表时机:单表出现性能瓶颈,通常是因为单表数据量过大,经过sql优化,还是读写性能较慢,以及涉及到当频繁插入或者联合查询时,速度变慢。

健康平安的活着的专栏 2112

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

数据库-分库分表

​ Apache ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成,既能够独立部署,又支持混合部署配合使用的产品组成。功能特性:它们均提供标准化的数据水平扩展分布式事务和分布式治理等功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。

m0_65419210的博客 2984

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

一文搞懂MySQL数据库分库分表

如果数据量过大,大家一般会分库分表。分库需要注意的内容比较少,但分表需要注意的内容就多了。 工作这几年没遇过数据量特别大的业务,那些过亿的数据,因为索引设置合理,单表性能没有影响,所以实战中一直没用过分表。最近手里有个项目,预估数据量会很大,分表方案是选项之一,趁着这次机会,把分表的内容整理一下。 这次要讲的主要是水平分库分表,其它种类的分库、分表比较容易理解。后面如果不详细说明,都指水平分库分表。 1.基础知识 1.1分库分表定义 1.1.1分库 垂直分库:按照业务模块进行切分,将不同模块的表切分到不同的

8256

JAVA分库分表

Sharding-JDBC可以进行分库分表,同时又可以解决分库分表带来的问题,它的核心功能是:数据分片和读写分离。数据分片的有效手段是对关系型数据库进行分库和分表。逻辑表水平拆分的数据库(表)的相同逻辑和数据结构表的总称。例:订单数据根据主键尾数拆分为10张表,分别是 t_order_0 到 t_order_9 ,他们的逻辑表名为 t_order。真实表在分片的数据库中真实存在的物理表。即上个示例中的 t_order_0 到 t_order_9。数据节点数据分片的最小单元。

xiaogaotongxue__的博客 2736

分库分表之数据库分片分类

本文系统分析了数据库分库分表优化方案。首先介绍垂直分表,通过拆分主表和扩展表减少IO负载,适用于大字段和低频访问场景。然后阐述垂直分库如何按业务模块拆分数据库解决资源瓶颈。文章重点解析水平分库分表技术,包括范围、哈希等多种拆分策略,解决单表数据量过大和并发性能问题。最后探讨分库分表带来的技术挑战及解决方案,如跨库查询、分布式事务等。提供了电商系统等实际案例,并对比不同方案的优缺点,为数据库性能优化提供系统指导。(149字)

chandfy的博客 1064

sharding-jdbc 分库分表的 4种分片策略

往下开展前先做个答疑,前两天有个小伙伴私下问了个问题说: 如果我一部分表做了分库分表,另一部分未做分库分表的表怎么处理?怎么才能正常访问? 这是一个比较典型的问题,我们知道分库分表是针对某些数据量持续大幅增长的表,比如用户表、订单表等,而不是一刀切将全部表都做分片。那么不分片的表和分片的表如何划分,一般有两种解决方案。 严格划分功能库,分片的库与不分片的库剥离开,业务代码中按需切换数据源访问 设置默认数据源,以 Sharding-JDBC 为例,不给未分片表设置分片规则,它们就不会执行,因为找不到路由

qq_41549632的博客 9992
上一篇: 6、Redis 高可用部署的两种方式 Redis Cluster 集群模式、Redis Sentinel 哨兵模式
下一篇: PostgreSQL 使用 ShardingSphere 实现更强大的分库分表 + 读写分离
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值