什么是分库分表?为什么要分库分表?什么时候需要分库分表?怎么样拆分?(数据库分库分表详解)

news2024/10/27 7:56:05

文章目录

    • 1、什么是分库分表?
      • 1.1、分库分表的概念
      • 1.2、分库分表的方式
        • 1.2.1、垂直分库
        • 1.2.2、垂直分表
        • 1.2.3、水平分库
        • 1.2.4、水平分表
    • 2、为什么要分库分表?
    • 3、什么时候需要分库分表?
    • 4、分库分表的数据路由
      • 4.1、数据路由的目的
      • 4.2、数据路由的方式
    • 5、分库分表的分布式事务
      • 5.1. 分布式事务的问题
      • 5.2. 分布式事务的解决方案
    • 6、实战案例
      • 6.1. 业务背景
      • 6.2. 分库分表方案设计
      • 6.3. 技术选型
      • 6.4. 实施步骤
      • 6.5. 效果评估
    • 7、总结

1、什么是分库分表?

1.1、分库分表的概念

分库分表的形式,主要是两种:垂直拆分和水平拆分。而拆分的粒度,一般又分为分库和分表,所以组
成的拆分策略最终如下:

  1. 分库:将一个数据库拆分成多个独立的数据库,每个数据库可以部署在不同的服务器上,从而分散数据存储和访问压力。

  2. 分表:将一个数据表拆分成多个小表,每个小表可以存储部分数据,从而减少单个表的数据量,提高查询和写入性能。

在这里插入图片描述

在这里插入图片描述

1.2、分库分表的方式

1.2.1、垂直分库

在这里插入图片描述
垂直分库:以表为依据,根据业务将不同表拆分到不同库中。

特点:

  • 每个库的表结构都不一样。
  • 每个库的数据也不一样。
  • 所有库的并集是全量数据。

原理:

  • 一个表中的字段可能具有不同的访问频率和性能需求,通过垂直分表可以将不常访问的字段分离出来,减少单个表的数据量和索引大小,提高查询性能。例如,将用户表中的基本信息字段和详细信息字段分别存储在两个不同的表中。

优点:可以提高查询性能,减少数据冗余。
缺点:表的关联查询变得复杂,需要使用多表连接或者多次查询。

1.2.2、垂直分表

在这里插入图片描述

将一个表按照字段的业务相关性拆分成多个小表,每个小表存储部分字段的数据。

特点:

  • 每个表的结构都不一样。
  • 每个表的数据也不一样,一般通过一列(主键/外键)关联。
  • 所有表的并集是全量数据。

原理:

  • 一个表中的字段可能具有不同的访问频率和性能需求,通过垂直分表可以将不常访问的字段分离出来,减少单个表的数据量和索引大小,提高查询性能。例如,将用户表中的基本信息字段和详细信息字段分别存储在两个不同的表中。

优点:可以提高查询性能,减少数据冗余。
缺点:表的关联查询变得复杂,需要使用多表连接或者多次查询。

1.2.3、水平分库

在这里插入图片描述
将一个数据库中的数据按照一定的规则分散存储到多个不同的数据库中。

特点:

  • 每个库的表结构都一样。
  • 每个库的数据都不一样。
  • 所有库的并集是全量数据。

原理:根据数据的某个特征(如用户 ID、订单 ID 等)进行哈希运算或者取模运算,将数据均匀地分布到多个数据库中。例如,根据用户 ID 进行取模运算,将用户数据分散存储到 10 个数据库中。

优点:可以提高数据库的可扩展性和性能,当数据量增加时,可以方便地添加新的数据库。
缺点:跨库查询和事务处理比较复杂,需要使用分布式查询和事务解决方案。

1.2.4、水平分表

在这里插入图片描述
以字段为依据,将一个表中的数据按照一定的规则分散存储到多个相同结构的表中。

特点:

  • 每个表的表结构都一样。
  • 每个表的数据都不一样。
  • 所有表的并集是全量数据。

原理:与水平分库类似,根据数据的某个特征进行哈希运算或者取模运算,将数据均匀地分布到多个表中。例如,根据订单创建时间进行分表,将每天的订单数据存储在一个单独的表中。

优点:可以提高表的查询和写入性能,当表的数据量增加时,可以方便地添加新的表。
缺点:表的管理变得复杂,需要使用中间件或者代码来实现数据的路由和合并。

2、为什么要分库分表?

在这里插入图片描述

随着互联网及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存
储,存在以下性能瓶颈:

  1. IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘IO,效率较低。 请求数据太多,带宽
    不够,网络IO瓶颈。
  2. CPU瓶颈:排序、分组、连接查询、聚合统计等SQL会耗费大量的CPU资源,请求数太多,CPU出
    现瓶颈。

为了解决上述问题,我们需要对数据库进行分库分表处理。
在这里插入图片描述
分库分表的中心思想都是将数据分散存储,使得单一数据库/表的数据量变小来缓解单一数据库的性能
问题,从而达到提升数据库性能的目的。

在业务系统中,为了缓解磁盘IO及CPU的性能瓶颈,到底是垂直拆分,还是水平拆分;具体是分 库,还是分表,都需要根据具体的业务需求具体分析。

3、什么时候需要分库分表?

网上查了好多资料,一个项目到底什么时候需要分库分表?
这个问题应该是没有标准的答案,但是可以从用户的角度回答这个问题,凡是通过数据库操作影响用户体验,甚至体验感很差时,都需要考虑优化数据库,进行分库分表。

行内不成文的标准:

  1. 单表记录行数超过500w条
  2. 单表存储空间超过2GB
  3. .

如果你的项目中的数据库出现上述情况,就要考虑分库分表了。

4、分库分表的数据路由

4.1、数据路由的目的

确定数据在分库分表后的存储位置,使得应用程序能够正确地访问和操作数据。

4.2、数据路由的方式

数据路由方式具体内容
哈希路由根据数据的某个特征进行哈希运算,将数据映射到不同的数据库或表中。例如,根据用户 ID 进行哈希运算,将用户数据存储到不同的数据库中。
范围路由根据数据的某个特征的取值范围,将数据分配到不同的数据库或表中。例如,根据订单金额的范围,将订单数据存储到不同的表中。
列表路由根据数据的某个特征的值是否在一个预定义的列表中,将数据分配到不同的数据库或表中。例如,根据用户所在地区,将用户数据存储到不同的数据库中。

5、分库分表的分布式事务

5.1. 分布式事务的问题

在分库分表的环境下,一个事务可能涉及多个数据库或表,传统的单机事务无法满足需求,需要使用分布式事务解决方案。

5.2. 分布式事务的解决方案

阶段具体内容
两阶段提交(2PC)分为准备阶段和提交阶段,协调者向参与者发送准备请求,参与者执行事务操作并记录日志,如果所有参与者都返回准备成功,则协调者发送提交请求,参与者提交事务;否则协调者发送回滚请求,参与者回滚事务。
三阶段提交(3PC)在 2PC 的基础上增加了一个预提交阶段,减少了参与者在准备阶段的阻塞时间,提高了事务的可用性。
补偿事务(TCC)分为 Try、Confirm、Cancel 三个阶段,Try 阶段进行业务检查和资源预留,Confirm 阶段进行业务确认操作,Cancel 阶段进行业务回滚操作。TCC 需要业务系统自己实现事务的补偿逻辑,比较复杂但性能较好。

6、实战案例

以一个电商系统为例,介绍数据库分库分表的实战过程。

6.1. 业务背景

电商系统中有用户、商品、订单等模块,随着业务的发展,数据量不断增长,数据库性能出现瓶颈。

6.2. 分库分表方案设计

  1. 垂直分库
    将用户模块、商品模块、订单模块分别存储在不同的数据库中。
    在这里插入图片描述

用户数据库存储用户信息,包括用户 ID、用户名、密码、联系方式等。
商品数据库存储商品信息,包括商品 ID、商品名称、价格、库存等。
订单数据库存储订单信息,包括订单 ID、用户 ID、商品 ID、订单金额、订单状态等。

  1. 垂直分表
    在用户表中,将用户的基本信息和详细信息分别存储在两个表中。
    在这里插入图片描述

用户基本信息表存储用户 ID、用户名、密码、联系方式等。
用户详细信息表存储用户 ID、用户头像、用户简介、用户等级等。

  1. 水平分库
    根据用户 ID 进行取模运算,将用户数据分散存储到多个数据库中。
    在这里插入图片描述

假设共有 10 个数据库,用户 ID 为 100 的用户数据存储在数据库 0 中,用户 ID 为 101 的用户数据存储在数据库 1 中,以此类推。

  1. 水平分表
    根据订单创建时间进行分表,将每天的订单数据存储在一个单独的表中。
    在这里插入图片描述

例如,订单表名为 order_20240917,表示 2024 年 9 月 17 日的订单数据。

6.3. 技术选型

  1. 数据库中间件
    选择一个成熟的数据库中间件来实现分库分表的功能,如MyCat、ShardingSphere等。

  2. 数据库
    选择一个性能高、稳定性好的数据库,如 MySQL、PostgreSQL 等。

6.4. 实施步骤

  1. 安装和配置数据库中间件
    根据中间件的文档进行安装和配置,设置分库分表的规则和参数。

  2. 改造应用程序
    修改应用程序的数据库连接配置,使其连接到数据库中间件。同时,修改应用程序的 SQL 语句,使其适应分库分表的环境。例如,在查询用户信息时,需要根据用户 ID 确定查询的数据库和表。

  3. 数据迁移
    将现有数据库中的数据迁移到分库分表后的数据库中。可以使用数据库中间件提供的数据迁移工具,或者编写自己的数据迁移脚本。

  4. 测试和优化
    在实施分库分表后,进行充分的测试,包括功能测试、性能测试、压力测试等。根据测试结果进行优化,调整分库分表的规则和参数,提高系统的性能和稳定性。

6.5. 效果评估

  1. 性能提升
    通过分库分表,数据库的查询和写入性能得到了显著提升。查询响应时间缩短,写入延迟减少,系统能够更好地应对高并发访问。

  2. 可扩展性增强
    当数据量增加时,可以方便地添加新的数据库或表,提高了系统的可扩展性。

  3. 可用性提高
    分库分表后,即使某个数据库或表出现故障,也不会影响整个系统的运行,提高了系统的可用性。

7、总结

数据库分库分表是一种解决大规模数据和高并发访问的有效技术方案。通过垂直分库、垂直分表、水平分库、水平分表等方式,可以将数据分散存储到多个数据库或表中,提高数据库的性能、可扩展性和可用性。在实施分库分表时,需要根据业务需求和数据特点进行合理的方案设计,选择合适的技术选型,并进行充分的测试和优化。

在这里插入图片描述


人生从来没有真正的绝境。只要一个人的心中还怀着一粒信念的种子,那么总有一天,他就能走出困境,让生命重新开花结果。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2224522.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024数学分析【南昌大学】

计算极限 lim ⁡ n → ∞ 2024 n ( 1 − cos ⁡ 1 n 2 ) n 3 1 + n 2 − n \mathop {\lim }\limits_{n \to \infty } \frac{{\sqrt[n]{{2024}}\left( {1 - \cos \frac{1}{{{n^2}}}} \right){n^3}}}{{\sqrt {1 + {n^2}} - n}} n→∞lim​1+n2 ​−nn2024 ​(1−cosn21​)n3​ …

桥接模式,外界与主机通,与虚拟机不通

一 二 在此选择Windows与外界连接的网卡,通过有线连就选有线网卡,通过无线连就选无线网卡。 三 如果需要设置固定IP,则选择"Manual"进行设置。我这边根据实际需要,走无线的时候用DHCP,走有线的时候设固定IP…

C#生成SVG文件(文本、线段、圆、椭圆、多边形的示例)

1. 介绍 一些参考博客: C#生成SVG涉及文字、线段、椭圆的示例 用C#解析渲染显示SVG矢量图转化格式保存 C#操作SVG矢量图-nuget库svg 开源库:https://github.com/svg-net/SVG 在NuGet上搜索SVG并安装: 2. 示例 引入的命名空间: …

初识算法 · 前缀和(1)

目录 前言: 一维数组的前缀和 题目解析 算法原理 算法编写 二维数组的前缀和 题目解析 算法原理 算法编写 前言: ​本文的主题是前缀和,通过两道题目讲解,一道是一维数组的模板,一道是二维数组的模板。 链接…

03 文件管理和IO重定向

1 文件系统目录结构 1.1 文件系统目录结构 文件系统的目录结构成树形结构一切文件的路径起点都是从根目录开始,用 / 表示文件名大小写敏感以 . 开头的文件都是隐藏文件路径通过 / 进行分割不同颜色的文件,它的类型是不同的每个文件都有两类数据&#xff…

S-Function

目录 S-Function介绍 生成S-Function的三种常用手段 使用手写S-函数合并定制代码 使用S-Function Builder块合并定制代码 使用代码继承工具合并定制代码 S-Function介绍 我们可以使用S-Function扩展Simulink对仿真和代码生成的支持。例如,可以使用它们&#xf…

初识Linux · 动静态库(incomplete)

目录 前言: 静态库 动态库 前言: 继上文,我们从磁盘的理解,到了文件系统框架的基本搭建,再到软硬链接部分,我们开始逐渐理解了为什么运行程序需要./a.out了,这个前面的.是什么我们也知道了。…

探索 Python 幽默之源:pyjokes 库全解析

🚀 探索 Python 幽默之源:pyjokes 库全解析 1. 背景介绍:为何选择 pyjokes? 在紧张的编程工作中,幽默是一种有效的缓解压力的方式。pyjokes 是一个专为程序员设计的 Python 库,它提供了丰富的单行笑话&am…

vscode配色主题与图标库推荐

vscode配色主题推荐:Andromedavsocde图标库: vscode-icons Andromeda Dark theme with a taste of the universe 仙女座:一套宇宙深空体验的哑暗色主题; 高对比度,色彩饱和; Easy Installation Open the extensions sidebar on Visual Studio CodeSear…

定时任务使用kafka

定时任务使用kafka 在上述业务场景中使用 Kafka 而不是直接定时执行任务有以下几个重要原因: 一、解耦 任务触发与执行分离: 使用 XXL-JOB 定时触发任务并将任务消息发送到 Kafka,实现了任务触发端(通常是调度系统)和…

C++,STL 049(24.10.26)

内容 pair的基本概念及构建方式。 运行代码 #include <iostream> #include <string>using namespace std;void test01() {// pair将2个数据组合成一组数据来使用&#xff08;first 、second&#xff09;// 注意pair的使用可以不添加头文件pair<string, int>…

Golang | Leetcode Golang题解之第501题二叉搜索树中的众数

题目&#xff1a; 题解&#xff1a; func findMode(root *TreeNode) (answer []int) {var base, count, maxCount intupdate : func(x int) {if x base {count} else {base, count x, 1}if count maxCount {answer append(answer, base)} else if count > maxCount {ma…

实验干货|电流型霍尔传感器采样设计02-有源滤波设计

在上一篇博客中&#xff0c;介绍了如何通过跨阻放大器&#xff0c;将霍尔输出的电流转换成电压。本篇博客继续介绍&#xff0c;如何将得到的电压进行滤波。 有源滤波和无源滤波的选择 简单来说&#xff0c;对于采样电路而言&#xff0c;无源滤波一般选择RC滤波&#xff0c;RC…

【K8S系列】Kubernetes Service 基础知识 详细介绍

在 Kubernetes 中&#xff0c;Service 是一种抽象的资源&#xff0c;用于定义一组 Pod 的访问策略。它为这些 Pod 提供了一个稳定的访问入口&#xff0c;解决了 Pod 可能频繁变化的问题。本文将详细介绍 Kubernetes Service 的类型、功能、使用场景、DNS 和负载均衡等方面。 1.…

使用FRP搭建内网穿透服务(新版toml配置文件,搭配反向代理方便内网网站访问)【使用frp搭建内网穿透】

FRP&#xff08;Fast Reverse Proxy&#xff09;是一个高性能的反向代理应用程序&#xff0c;主要用于内网穿透。它允许用户将内部网络服务暴露到外部网络&#xff0c;适用于 NAT 或防火墙环境下的服务访问。 他是一个开源的 服务 如果大家不想用 花生壳 软件&#xff0c;可以尝…

遗传算法(Genetic Algorithm)理论详解

遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;是一种模拟自然界生物进化过程与机制的随机搜索与优化算法&#xff0c;被广泛应用于计算机科学、工程技术、经济学等众多领域。 1. 基本原理 1.1 生物遗传学类比 遗传算法的灵感来源于达尔文的进化论。在自然…

订购 Claude AI 的第二天 它独自完成 文字转语音 flask应用

图二里&#xff0c;删除几个无关的 chats 全程我做的工作&#xff1a;向 AI 提要求&#xff0c;copy / paste 代码&#xff0c;在venv验证运行&#xff0c;向 AI 反馈&#xff0c;总共用了3个 chats.&#xff08;图中的只有一个 Chat&#xff0c; 删掉的另外两个: Python 库安…

背包问题(位运算优化、bitset)

3180. 执行操作可获得的最大总奖励| . - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 rewardValues&#xff0c;长度为 n&#xff0c;代表奖励的值。 最初&#xff0c;你的总奖励 x 为 0&#xff0c;所有下标都是 未标记 的。你可以执行以下操作 任意次 &#xf…

数字IC后端实现 | Innovus各个阶段常用命令汇总

应各位读者要求&#xff0c;小编最近按照Innovus流程顺序整理出数字IC后端项目中常用的命令汇总。限于篇幅&#xff0c;这次只更新到powerplan阶段。有了这份Innovus常用命令汇总&#xff0c;学习数字IC后端从此不再迷路&#xff01;如果大家觉得这个专题还不错&#xff0c;想继…

Linux 字符设备驱动 之 无法归类的《杂项设备驱动》

学习目标&#xff1a; 了解 杂项设备驱动 和普通字符设备的异同&#xff0c;及杂项设备驱动程序的写法 学习内容&#xff1a; 一、杂项设备驱动的特别之处 杂项设备&#xff08;Miscellaneous Devices&#xff09;是一种通用的设备类型&#xff0c;用于表示那些不适合其他设备…