第104讲:数据库分库分表的意义与实现策略(MyCat)

文章目录

    • 1.分库分表的目的
    • 2.分库分表的拆分策略
      • 2.1.垂直拆分
      • 2.2.水平拆分
    • 3.Mycat水平拆分的分片规则

1.分库分表的目的

互联网中的应用程序,随着公司的发展,应用系统的使用人数、数据量都再持续增长,数据库层面就会产生一定的瓶颈。

如果一开始数据库是单机模式,当业务量增大时,就会导致IO、CPU出现瓶颈,数据量太多、数据库缓存不够,从而产生大量的磁盘IO,导致数据库的性能下降。

即使将数据库升级改造成读写分离集群,随着业务的持续正能量,核心业务表也会产生瓶颈,数据量过大,当有功能使用这张表时,效率就会很低,会出现加载过慢的现象。

为了避免、解决大表带来的性能瓶颈,就需要对数据库进行分库分表的操作了。

  • 可以对业务量、数据量很大的数据库,进行分库操作,将其中的一部分表拆分到其他的数据库服务器中,程序同时连接这两个数据源,缓解单库50%的压力。

  • 也可以对数据量很大的一张表进行分表操作,将该表拆分成多张表,可以按照字段拆分,也可以按照数据量拆分,大多数情况下都是按照数据量进行拆分,例如将一张4500w行的表拆分成3张表,每张表承担1500w的数据量,缓解大表的压力。

分库分表的中心思想就是将数据分散存储在多个数据库节点中,使单一数据库或者数据量很大的表得到缓解,提高数据库的性能。

2.分库分表的拆分策略

分库分表的形式主要有两种方式,分别是垂直拆分和水平拆分,对于拆分的力度,又分为分库和分表。

2.1.垂直拆分

垂直拆分分为垂直分库和垂直分表。

所谓的垂直拆分指的将一个实体中的零件拆分到另一个实体上,相当于物理层面。

1)垂直分库

垂直分库指的是将一个库中的多个表,拆分到不同的库中,这就是垂直分库。

垂直分库中以表作为单位,根据业务表的不同,拆分到多个不同的数据库中。

垂直分库后不同库中存放平台库的表都是不同的,数据也都不相同,因为分库后,每一个库中会存放一部分表,各自表存放各自的数据,互不干涉,所有库的表加起来形成完整的平台库数据,

如下图所示,期初在一个数据库中有6张表,垂直拆分后,将库中的表分给了三个单独的库,每个库中存放2张表,从而达到提升性能的目的。

image-20220712163016707

2)垂直分表

垂直分表指的是将一个表拆分成多个表,按照字段为单位作为拆分依据。

垂直分表后一张表会被拆分成多张表,每张表的表结构也不同,因为是按照字段拆分的,可能1-5个字段在A1表中,5-10个字段在A2表中,每张表的数据也不可能相同,分表后的多张表之间一般通过主键、外键进行关联。

垂直分表后,多张表的数据加起来才是完整的数据。

如下图所示,tb_user表进行了垂直分表,其中id、age字段分到了tb_user表中,剩余的字段分到了tb_usersec表中。

image-20220712165133303

2.2.水平拆分

水平拆分分为水平分库和水平分表。

所谓的水平拆分是从逻辑层面上进行拆分,相当与搬家,换壳不换住户。

1)水平分库

水平分库是按照一定的策略以字段作为依据,将一个库的所有表拆分到多个库中,每个库中的表结构都是相同的,只是数据量不同,用户的读写操作会被路由到某一个分库中,缓解单库的压力,水平分库后,所有库的数据量才是完整的数据量。

如下图所示,该库中有两张数据表,水平分库后,被拆分到了多个库中,但是每个库中都存放相同的表,只是数据不同,用户的读写操作会被路由到不同的分库中进行处理。

image-20220712170856363

2)水平分表

水平分库是按照一定的策略以字段作为依据,将一个表的数据拆分到多张表中,缓解单表的压力,拆分出来的多张表只是名字不同,表数据都相同,用户的读写操作会被路由到其中一个分表中,拆分出来的所有表的数据量加起来才是完整的数据量。

如下图所示,tb_goods表进行了水平拆分,拆分后变成了三张表,每张表中会存放一部分数据,用户的读写操作会被路由到其中一张表中,三张表的所有数据量才是整张表的全部数据。

image-20220712171158007

3.Mycat水平拆分的分片规则

Mycat水平分库分表,都是对表中的数据量进行拆分的,将一个数据库中的表数据拆分到多个数据库实例中,并不能实现将一个表在当前数据库中拆成多个表。

Mycat的分片规则都已经写好了,我们直接来调用即可,无需认为编写。

水平拆分主要是根据分片规则进行逻辑上的拆分,常用的水平拆分分片规则如下:

  • 范围分片
    • 根据表中的数据量大小,决定将表中的数据拆分到那些分片上,例如0~500w条数据拆分到分片1,500w-1000w数据拆分到分片2。
  • 取模分片
    • 根据数据量与节点数量的求模运算,根据运算结果,决定数据存储的分片,例如插入第50条数据,节点有4个,那么就是50÷4=12余2,余数2就是该条数据写入的分片ID。
  • 一致性Hash分片
    • 所谓一致性哈希,相同的哈希因子计算值总是被划分到相同的分区表中,不会因为分区节点的增加而改变原来数据的分区位置,有效的解决了分布式数据的拓容问题。
  • 枚举分片
    • 通过在配置文件中配置可能的枚举值, 指定数据分布到不同数据节点上, 本规则适用于按照省份、性别、状态拆分数据等业务
  • 日期分片
    • 根据日期时间来进行分库分表,常见的有按月分表,每个月产生一个新表。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt篇——QTableWidget选中多行右键删除

效果如图: 代码如下: 头文件中: QTableWidgetItem *selectedItem; //表格被选中的一行 QMenu* originDataTableContextMenu; //表格右键菜单 QAction* originDataTableActionDel; //表格右键菜单…

vue中css语法错误

错误类型:(有很多行出现这个错误) 问了问GPT: 相关博客:SassError: expected selector报错 ::v-deep 替换 /deep/_expected selector root stylesheet-CSDN博客

C语言之操作符详解

文章目录 一、算术操作符二、移位操作符1、 原码、反码、补码2、左移操作符3、右移操作符 三、位操作符1、按位与【&】2、按位或【|】3、按位异或【^】4、按位取反【~】5、两道面试题6、进制定位将变量a的第n位置为1将变量a的第n位置为0 四、赋值操作符1、复合赋值符 五、单…

List集合的Stream流式操作实现数据类型转换

问题现象: 最近在项目中,有一些逻辑想用List集合的Stream流式操作来快速实现,但由于之前没做好学习笔记和总结,导致一时间想不起来,只能用本方法来解决,如下: 可以看出来代码量是比较冗长的&…

跟着野火学FreeRTOS:第二段(堆存储管理)

F r e e R T O S FreeRTOS FreeRTOS从版本 V 9.0.0 V9.0.0 V9.0.0开始,内核对象所用的存储空间可以在编译时静态分配或在运行时动态分配,早期的版本不同时支持静态分配和动态分配,这里讲到的堆存储管理是和动态分配相关的。从版本 V 9.0.0 V9…

详细讲解:文物预防性保护解决方案的目标

一、文物预防性保护方案的系统目标 可移动文物预防性保护监测与调控系统,是博物馆开展科学、有效的预防性保护策略的关键工程,整套系统包括监测系统平台建设、调控设备部署、数据传输设备部署和环境数据监测设备安装工程。项目完成时将达到以下目标: 1)构建覆盖全…

C语言数据结构基础-单链表

1.链表概念 在前面的学习中,我们知道了线性表,其中逻辑结构与物理结构都连续的叫顺序表,那么: 链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构,数据元素的逻辑顺序是通过链表 中的指针链接次序实现的 。 2.链表组…

单点登录的三种方式

前言 在B/S系统中,登录功能通常都是基于Cookie 来实现的。当用户登录成功后,一般会将登录状态记录到Session中,或者是给用户签发一个 Token,无论哪一种方式,都需要在客户端保存一些信息(Session ID或Token)&#xff0…

【Java程序设计】【C00317】基于Springboot的智慧社区居家养老健康管理系统(有论文)

基于Springboot的智慧社区居家养老健康管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的智慧社区居家养老健康管理系统设计与实现,本系统有管理员、社区工作人员、医生以及家属四种角色权限 管…

嵌入式学习第二十二天!(线程间通信)

线程间通信: 线程间通信,通过利用全局变量,来实现通信,但是在通信过程中使用这些变量可能会导致资源竞争,那么就需要使用到互斥锁和信息量,辅助我们实现线程的通信。 1. 线程分离属性: 线程结束…

简单版 git快速上手使用 clone项目 新建/切换分支 提交修改

Git是一个广泛使用的版本控制系统,允许多个用户跟踪文件的更改,并协作开发项目。 首先确定自己电脑已经安装了git,具体安装步骤请查找教程,应该不难。 以windows电脑为例,安装完后在搜索栏搜索git会出现 先解释一下这…

J1—Vivado调试技巧VIO IP

1.简介 VIO(Virtual Input/Output)IP核是一种用于FPGA设计的IP核,它可以模拟输入/输出设备的功能,如键盘、鼠标、显示器等。VIO IP核可以在FPGA设计中用于调试和验证,帮助工程师快速定位问题并进行调试。如图所示&…