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

为什么要分库分表

  • 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 表。这就是逻辑表。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue 问题解决

一、问题:TypeError: (0 , _message.default) is not a function 当没有default时,在其他页面import引入的时,必须加{}。 二、问题:Vue前端页面的表格数据总是一行一行的显示 使用Async/Await来解决前端数据一行一行显示的问题。可以将获取部…

python 实现粒子群算法(带绘制)

本文章用python实现了粒子群算法, 标准PSO的算法流程如下: 初始化一群微粒(群体规模为m),包括随机的位置和速度;评价每个微粒的适应度;对每个微粒,将它的适应值和它经历过的最好位…

众和策略股市行情分析:股票开户后什么时候能交易?

股票开户后什么时候能生意? 股票开户后不才一生意日便能正常展开生意操作,包含申报股票生意及非生意事务。假设投资者是周五或接近节假期时结束的开户,就要不才周一或假期结束后才华进行生意。 当然,假设投资者注册的是一些特别…

BDD - Python Behave 配置文件 behave.ini

BDD - Python Behave 配置文件 behave.ini 引言behave.ini配置参数的类型配置项 behave.ini 应用feature 文件step 文件创建 behave.ini执行 Behave 引言 前面文章 《BDD - Python Behave Runner Script》就是为了每次执行 Behave 时不用手动敲一长串选项,其实还有…

《深入理解C++11:C++11新特性解析与应用》笔记四

第四章 新手易学,老兵易用 4.1 右尖括号>的改进 在 C98 中,有一条需要程序员规避的规则:如果在实例化模板的时候出现了连续的两个右尖括号 >,那么它们之间需要一个空格来进行分隔,以避免发生编译时的错误。C98 会将>&g…

【量化】蜘蛛网策略复现

文章目录 蜘蛛网策略研报概述持仓数据整理三大商品交易所的数据统一筛选共有会员清洗数据计算研报要求数据全部代码 策略结果分析无参数策略有参数策略正做反做 MSD技术指标化 蜘蛛网策略 策略来自《东方证券-股指期货趋势交易之蜘蛛网策略——从成交持仓表中捕捉知情投资者行为…

腾讯云轻量应用服务器详细介绍

腾讯云轻量应用服务器开箱即用、运维简单的轻量级云服务器,CPU内存带宽配置高并且价格特别优惠,轻量2核2G3M带宽62元一年、2核2G4M优惠价118元一年,540元三年、2核4G5M带宽218元一年,756元3年、4核8G12M带宽646元15个月等&#xf…

Linux操作系统:LVM与磁盘配额

目录 一、LVM逻辑卷管理基础 1、LVM逻辑卷管理的概念 2、LVM逻辑卷管理的核心组件 3、LVM逻辑卷管理的优势 4、LVM逻辑卷管理的命令 4.1 扫描命令的用法 4.1.1 pvscan 4.1.2 vgscan 4.1.3 lvscan 4.2 查看命令的用法 4.2.1 pvdisplay 4.2.2 vgdisplay 4.2.3 lvdis…

12.27_黑马数据结构与算法笔记Java(补2)

目录 279 0-1 背包问题 动态规划 实现 280 0-1 背包问题 动态规划 降维 281 完全背包问题 动态规划 分析 282 完全背包问题 动态规划 实现 283 零钱兑换问题 动态规划 分析 284 零钱兑换问题 动态规划 实现 285 零钱兑换问题 动态规划 降维 286 零钱兑换II 动态规划 分析…

【idea】运行工程时候卡了许久Java Method Breakpoints

老以为是数据库连接不上,此问题概率性小,操作上面不小心打了断点… 应该是打断点的时候,打到了方法上面,去掉哟 Java Method Breakpoints

C++day2作业

把课上strcut的练习&#xff0c;尝试着改成class #include <iostream>using namespace std; class Stu { private:int age;string sex;int hign; public:int soce;void get_information();void set_information(); }; void Stu::set_information() {static Stu s1;cout …

C++ DAY2作业

1.课堂struct练习&#xff0c;用class&#xff1b; #include <iostream>using namespace std;class Stu { private:int age;char sex;int high; public:double score;void set_values(int a,char b,int c,double d);int get_age();char get_sex();int get_high(); }; vo…

「从红月开始」运输公司遭精神污染,小十七救哥哥,事发地陷危机

Hello,小伙伴们&#xff0c;我是拾荒君。 国漫《从红月开始》第3集超前爆料&#xff0c;本次透露陆辛首次被派遣去调查精神污染的任务。他的目的地是四方运输公司&#xff0c;一个主要由亡命之徒组成的组织。他们表面上从事运输业务&#xff0c;但背地里进行偷渡和走私活动。 …

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

&#x1f4cb; 前言 ​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《斯坦福大学之CSAPP》⏰诗赋清音&#xff1a;桃花灼灼春风暖&#xff0c;心随乐曲扬徐徐。 苦尽甘来梦未阑&#xff0c;岁月长河任舟游。 ​ &#x1f389;欢迎…

cnPuTTY 0.80.0.1—PuTTY Release 0.80中文版本简单说明~~

2023-12-18 官方发布了PuTTY 0.80本次发布主要是针对Terrapin攻击(CVE-2023-48795)的修改发布。 更多详细的内容请查看PuTTY Change Log。 有关Terrapin攻击可用简单参考&#xff1a;警告&#xff01;&#xff01;&#xff01;Terrapin攻击(CVE-2023-48795)~~~ 为了缓解此漏洞…

【线性代数】通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗?

一、通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗&#xff1f; 如果你进行的矩阵乘法涉及一个线性方程组 Ax b&#xff0c;并且你乘以一个可逆矩阵 M&#xff0c;且产生新的方程组 M(Ax) Mb&#xff0c;那么这两个系统是等价的&#xff1b;它们具有相同的解集。这…

【unity3D-粒子系统】粒子系统主模块-Particle System篇

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的粒子系统主模块-Particle System 基础知识 Particle System 介绍&#xff1a;粒子系统的主模块&#xff0c;是必需的模块&#x…

在线客服系统推荐:提升客户满意度与工作效率的利器

客服系统分为售前和售后&#xff0c;售前客户系统是为了能够及时解决客户在购买产品前的问题&#xff0c;通过客服人员让客户了解产品的功能点是能够满足他们的需求点&#xff0c;从未达到转化的目的。 而售后客户系统主要是提供给购买后的客户强大的产品售后支持&#xff0c;…

PiflowX组件-DataGen

DataGen组件 组件说明 按数据生成规则模拟数据。在开发和演示场景下使用比较方便。具体可以查看Flink官方DataGen connector。 计算引擎 flink 有界性 字段的数据全部生成完成后&#xff0c;source 就结束了。 因此&#xff0c;有界性取决于字段的有界性。 组件分组 co…

SQL Server 索引和视图

CSDN 成就一亿技术人&#xff01; 难度指数&#xff1a;* * * CSDN 成就一亿技术人&#xff01; 目录 1.索引 什么是索引&#xff1f; 索引的作用&#xff1f; 索引的分类 1. 唯一索引 2. 主键索引 3. 聚集索引 4.非聚集索引 5.复合索引 6.全文搜索 索引的创建&am…