【数据库】为什么要分库分表

news2025/2/25 21:02:55

为什么要分库分表

  • 1.为什么要分库分表?
  • 2.垂直拆分
  • 3.水平拆分
  • 4.总结
    • 4.1 逻辑库和物理库
    • 4.2 逻辑表和物理表

1.为什么要分库分表?

随着近些年信息化大跃进,各行各业无纸化办公产生了大量的数据,而越来越多的数据存入了数据库中。当使用 MySQL 数据库的时候,单表超出了 2000 万数据量就会出现性能上的分水岭。并且物理服务器的 CPU、内存、存储、连接数等资源有限,某个时段大量连接同时执行操作,会导致数据库在处理上遇到性能瓶颈。为了解决这个问题,行业先驱们充分发扬了分而治之的思想,对大表进行分割,然后实施更好的控制和管理,同时使用多台机器的 CPU、内存、存储,提供更好的性能。而分而治之则有两种方式:垂直拆分水平拆分

2.垂直拆分

垂直拆分分为 垂直分库垂直分表。先说说 垂直分库。垂直分库其实是一种简单逻辑分割。比如我们的数据库中有商品表 Products、还有对订单表 Orders,还有积分表 Scores。接下来我们就可以创建三个数据库,一个数据库存放商品,一个数据库存放订单,一个数据库存放积分。如下图所示:

在这里插入图片描述
垂直分库 有一个优点,他能够根据业务场景进行孵化,比如某一单一场景只用到某 2、3 张表,基本上应用和数据库可以拆分出来做成相应的服务。

再来说说 垂直分表,比较适用于那种字段比较多的表,假设我们一张表有 100 个字段,我们分析了一下当前业务执行的 SQL 语句,有 20 个字段是经常使用的,而另外 80 个字段使用比较少。这样我们就可以把 20 个字段放在主表里面,我们在创建一个辅助表,存放另外 80 个字段。当然主表和辅助表都是有主键的。他们通过主键进行关联合并,就可以凑成 100 个字段的表。
在这里插入图片描述
垂直分表 可以解决跨页的问题。在 Oracle 中叫行链接。怎么理解呢?就是你字段少的情况下,原本一行数据只需要存在一个页里面就行了,但是字段多的情况就存不下了,就需要跨页。这样就会造成额外寻址,造成性能上的开销。另外将这么长的一行数据载到内存中,往往是几个页面,结果咱们经常只访问其中的几个字段,对内存也是一个极大的开销。所以为了让内存缓存更多数据,减少磁盘 I/O,垂直分表 就是很好的手段。

总体来说:垂直拆分 有以下优点:

  • ✅ 跟随业务进行分割,和最近流行的微服务概念相似,方便解耦之后的管理及扩展。
  • ✅ 高并发的场景下,垂直拆分使用多台服务器的 CPU、I/O、内存能提升性能,同时对单机数据库连接数、一些资源限制也得到了提升。
  • ✅ 能实现冷热数据的分离。

垂直拆分的缺点:

  • ⭕ 部分业务表无法 join,应用层需要很大的改造,只能通过聚合的方式来实现。增加了开发的难度。
  • ⭕ 当单库中的表数据量增大的时候依然没有得到有效的解决。
  • ⭕ 分布式事务也是一个难题。

3.水平拆分

当某张表数据量达到一定的程度的时候,前面曾说过 MySQL 单表出现 2000 万以上数据就会出现性能上的分水岭。此时发现没有办法根据业务规则再进行拆分了,就会导致单库上的读写性能出现瓶颈。此时就只能进行水平拆分了。

水平拆分又分为 库内分表分库分表。先说说 库内分表。假设当我们的 Orders 表达到了 5000 万行记录的时候,非常影响数据库的读写效率,怎么办呢?我们可以考虑按照订单编号的 order_id 进行 range 分区,就是把订单编号在 1 - 1000 万的放在 order1 表中,将编号在 1000 万 - 2000 万的放在 order2 中,以此类推,每个表中存放 1000 万数据。如下图所示:
在这里插入图片描述
虽然我们可以通过 库内分表 把单表的容量固定在 1000 万,但是这些表的数据仍然存放在一个库内,使用的是该主机的 CPU、IO、内存。单库的连接数也有限制。并不能完全的降低系统的压力。此时,我们就要考虑另外一种技术叫 分库分表。分库分表在库内分表的基础上,将分的表挪动到不同的主机和数据库上。可以充分的使用其他主机的 CPU、内存和 I/O 资源。并且分库之后,单库的连接数限制也不在成为瓶颈。但是 “成也萧何败也萧何”,如果你执行一个扫描不带分片键,则需要在每个库上查一遍。刚刚我们按照 order_id 分成了 5 个库,但是我们查询是 name='AAA' 的条件并且不带 order_id 字段时,它并不知道在哪个分片上查,则会创建 5 个连接,然后每个库都检索一遍。这种广播查询则会造成连接数增多。因为它需要在每个库上都创立连接。如果是高并发的系统,执行这种广播查询,系统的 thread 很快就会告警。
在这里插入图片描述
总体来说:水平拆分 的优点有以下:

  • ✅ 水平扩展能无线扩展。不存在某个库某个表过大的情况。
  • ✅ 能够较好的应对高并发,同时可以将热点数据打散。
  • ✅ 应用侧的改动较小,不需要根据业务来拆分。

水平拆分 的缺点:

  • ⭕ 路由是个问题,需要增加一层路由的计算,而且像前面说的一样,不带分片键查询会产生广播 SQL。
  • ⭕ 跨库 join 的性能比较差。
  • ⭕ 需要处理分布式事务的一致性问题。

4.总结

当前我们的系统,垂直拆分水平拆分 都在使用,垂直拆分主要是做业务上的分割,把业务的各个子系统都规划好,能解耦就解耦。而垂直拆分之后。我们再做水平分库分表。通过取模算法将大表数据拆到若干个库中。

4.1 逻辑库和物理库

介绍了上述的分库分表,我们有必要说一下几个概念,一个是 逻辑库物理库 的概念。我们还是拿水平拆分中的分库分表来说。我们在物理层面,将一个库的数据分割到了 5 个数据库中。这 5 个数据库就是物理库,而它们对上层应用的展现则是一个库。这个对上层展现的库就叫逻辑库。逻辑库对应用层是透明的。应用不需要了解底层的情况,直接使用就行了。

4.2 逻辑表和物理表

还是拿水平拆分中的分库分表来说,orders 表总共被分成了 5 份,分别在底层是 orders_1 - orders_5。这底层的 5 个表就是物理表。但是对应用层面来说,只有 orders 表。这就是逻辑表。

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

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

相关文章

代码随想录-刷题第三十九天

动态规划理论基础 动态规划的题目由重叠子问题构成,每一个状态一定是由上一个状态推导出来的。这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的。 动态规划五步曲 确定dp数组(dp table)以及下标的含义…

03-JWT令牌和普通令牌的区别,JWT令牌的格式和生成

JWT令牌 普通令牌问题 普通令牌的问题: 以OAuth2的密码模式为例进行说明,客户端每次访问资源时, 资源服务都需要远程请求认证服务去校验令牌的合法性导致执行性能低 如果能够让资源服务自己校验令牌的合法性,这样就可以省去远程请求认证服务的成本并提高性能 常见…

如何使用mac电脑,1、使用快捷命令打开访达,2、使用终端命令创建文件,3、使用命令打开创建的文件,并且在vscode中打开

如何使用mac电脑 1、使用快捷命令打开访达 optioncommand空格键 快速进入访达 shiftcmmandn 创建一个空目录 2、使用终端命令创建文件 2.1进入文件夹 在终端页面输入“cd /Users/yunf/Desktop/”并按回车键(此时进入到桌面文件夹,如果需要进入到其它…

TCP 滑动窗口

滑动窗口(Sliding window)是一种流量控制技术。早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。由于大家不知道网络拥塞状况,同时发送数据,导致中间节点阻塞掉包,谁也发不了数据&#xff0…

19个Python语法糖和9个内置装饰器

19 个Sweet的 Python Syntax Sugar,用于改善您的编码体验 文章目录 19 个Sweet的 Python Syntax Sugar,用于改善您的编码体验1. 联合运算符Union Operators:合并 Python 字典的最优雅方式2. 类型提示Type Hints:使您的 Python 程序…

Linux高级管理——rsync远程同步

一、配置rsync源服务器: rsync (Remote Sync,远程同步)是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份.保持链接和权限,且采用优化的同步算法.传输前…

ChatGPT4.0(中文版)国内无限制免费版(附网址)

ChatGPT,由OpenAI开发的人工智能语言模型。它是你的数字对话伙伴,无论你有何问题或需要什么帮助,它都能提供有用的信息。 经过不断的研发和更新,ChatGPT的性能和功能得到了显著提升。现在,我们将重点介绍ChatGPT的两个…

Apache Commons Pool的对象池技术

第1章:引言 咱们今天来聊聊一个在Java开发中超级实用,但又经常被忽视的技术——对象池技术。可能你们已经听说过“对象池”这个名词,但对它的具体作用和重要性还有些模糊。别急,小黑带你们一步步深入了解。 想象一下&#xff0c…

《Linux系列》Linux磁盘MBR分区扩容

文章目录 Linux磁盘MBR分区扩容1.前言2.控制台磁盘扩容3.分区扩容3.1 fdisk3.2 lsblk3.3 扩容分区 4.扩容文件系统4.1 df4.2 扩容文件系统 Linux磁盘MBR分区扩容 1)参考阿里云扩容分区文档,整理MBR分区扩容 2)本文档适用于MBR分区(fdisk -lu查…

【CSAPP】探究BombLab奥秘:Phase_2的解密与实战

📋 前言 ​🌈个人主页:Sarapines Programmer🔥 系列专栏:《斯坦福大学之CSAPP》⏰诗赋清音:桃花灼灼春风暖,心随乐曲扬徐徐。 苦尽甘来梦未阑,岁月长河任舟游。 ​ 🎉欢迎…

Qt sender()函数

sender函数原型: QObject *sender() const; 如果在由信号激活的插槽中调用该函数,返回指向发送信号的对象的指针,否则返回0,该指针仅在从该对象的线程上下文调用此函数的槽执行期间有效。 主要代码如下: 其中运用了Q…

为什么设计制造行业需要数据加密?

设计制造行业是一个涉及多种技术、工艺、材料和产品的广泛领域,它对经济和社会的发展有着重要的影响。然而,随着数字化、智能化和网络化的发展,设计制造行业也面临着越来越多的数据安全风险,如数据泄露、数据篡改、数据窃取等。这…

sonarqube安装踩坑记录

如果用java1.8和mysql,则sonarqube版本不能超过7.8,看这里。 sonarqube7.8安装包地址: https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.8.zip 安装步骤: 1、下载sonarqube安装包 wget https://binari…

EduChat账号密码登录

内测申请:请邮件dan_yhstu.ecnu.edu.cn,以“EduChat内测申请单位”作为邮件标题,邮件内容中写明用途 先去申请个账号和密码,会有一两天延迟吧,挺快的。 拿到账号之后去官网,点一个 官网传送门 就出来用账号密码登录的…

C++ Qt开发:SqlTableModel映射组件应用

Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍SqlTableModule组件的常用方法及灵活运用。 …

Android 8.1 设置USB传输文件模式(MTP)

项目需求,需要在电脑端adb发送通知手机端接收指令,将USB的仅充电模式更改成传输文件(MTP)模式,便捷用户在我的电脑里操作内存文件,下面是我们的常见的修改方式 1、android12以下、android21以上是这种方式…

竞赛保研 基于大数据的时间序列股价预测分析与可视化 - lstm

文章目录 1 前言2 时间序列的由来2.1 四种模型的名称: 3 数据预览4 理论公式4.1 协方差4.2 相关系数4.3 scikit-learn计算相关性 5 金融数据的时序分析5.1 数据概况5.2 序列变化情况计算 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 &…

机器人中的数值优化之牛顿共轭梯度法

欢迎大家关注我的B站: 偷吃薯片的Zheng同学的个人空间-偷吃薯片的Zheng同学个人主页-哔哩哔哩视频 (bilibili.com) 本文ppt来自深蓝学院《机器人中的数值优化》 如何解决Hessian矩阵非正定的情况 求解线性系统需要很精确么 引入截断的机制,如果Hessia…

TC3XX GTM时钟频率计算

一、CMU框图 二、TOM 固定时钟生成(FXU)子单元为TOM模块和MON模块生成预定义的不可配置时钟CMU_FXCLK[y](y:0…4)。CMU_FXCLK[y]信号是从全局时钟分频器产生的CMU_GCLK_EN信号中导出的。划分因子被定义为20、24、28、212和216 。 1、相关配置 1.1 GTM外围频率 1.2可配置…