MySQL-如何分库分表?一看就懂

2023-11-03

一、为什么要分库分表

如果一个网站业务快速发展,那这个网站流量也会增加,数据的压力也会随之而来,比如电商系统来说双十一大促对订单数据压力很大,Tps十几万并发量,如果传统的架构(一主多从),主库容量肯定无法满足这么高的Tps,业务越来越大,单表数据超出了数据库支持的容量,持久化磁盘IO,传统的数据库性能瓶颈,产品经理业务·必须做,改变程序,数据库刀子切分优化。数据库连接数不够需要分库,表的数据量大,优化后查询性能还是很低,需要分。

二、什么是分库分表

分库分表方案是对关系型数据库数据存储和访问机制的一种补充。

分库:将一个库的数据拆分到多个相同的库中,访问的时候访问一个库

分表:把一个表的数据放到多个表中,操作对应的某个表就行

三、分库分表的几种方式

1.垂直拆分

(1) 数据库垂直拆分

根据业务拆分,如图,电商系统,拆分成订单库,会员库,商品库

(2)表垂直拆分

根据业务去拆分表,如图,把user表拆分成user_base表和user_info表,use_base负责存储登录,user_info负责存储基本用户信息

垂直拆分特点

1.每个库(表)的结构都不一样

2.每个库(表)的数据至少一列一样

3.每个库(表)的并集是全量数据

垂直拆分优缺点

优点:

1.拆分后业务清晰(专库专用按业务拆分)

2.数据维护简单,按业务不同,业务放到不同机器上

缺点:

1.如果单表的数据量,写读压力大

2.受某种业务决定,或者被限制,也就是说一个业务往往会影响到数据库的瓶颈(性能问题,如双十一抢购)

3.部分业务无法关联join,只能通过java程序接口去调用,提高了开发复杂度

2. 水平拆分

(1) 数据库水平拆分

如图,按会员库拆分,拆分成会员1库,会员2库,以userId拆分,userId尾号0-5为1库

6-9为2库,还有其他方式,进行取模,偶数放到1库,奇数放到2库

(2) 表水平拆分

如图把users表拆分成users1表和users2表,以userId拆分,进行取模,偶数放到users1表,奇数放到users2表

水平拆分的其他方式

range来分,每个库一段连续的数据,这个一般是按比如时间范围来的,但是这种一般较少用,因为很容易产生热点问题,大量的流量都打在最新的数据上了,优点:扩容的时候,就很容易,因为你只要预备好,给每个月都准备一个库就可以了,到了一个新的月份的时候,自然而然,就会写新的库了 缺点:大部分的 请求,都是访问最新的数据。实际生产用range,要看场景,你的用户不是仅仅访问最新的数据,而是均匀的访问现在的数据以及历史的数据

hash分发,优点:可以平均分配每个库的数据量和请求压力 缺点:扩容起来比较麻烦,会有一个数据迁移的这么一个过程

水平拆分特点

1.每个库(表)的结构都一样

2.每个库(表)的数据都不一样

3.每个库(表)的并集是全量数据

水平拆分优缺点

优点:

1.单库/单表的数据保持在一定量(减少),有助于性能提高

2.提高了系统的稳定性和负载能力

3.拆分表的结构相同,程序改造较少。

缺点:

1.数据的扩容很有难度维护量大

2.拆分规则很难抽象出来

3.分片事务的一致性问题部分业务无法关联join,只能通过java程序接口去调用

四、分库分表带来的问题

分布式事务

跨库join查询

分布式全局唯一id

开发成本 对程序员要求高

五、分库分表技术如何选型

分库分表的开源框架

jdbc 直连层:shardingsphere、tddl

proxy 代理层:mycat,mysql-proxy(360)

jdbc直连层

jdbc直连层又叫jdbc应用层,是因为所有分片规则,所有分片逻辑,包括处理分布式事务

所有这些问题它都是在应用层,所有项目都是由war包构成的,所有分片都写成了jar包,放到了war包里面,java需要虚拟机去运行的,虚拟机运行的时候就会把war包里面的字节文件进行classLoder加载到jvm内存中,所有分片逻辑都是基于内存方进行操作的

proxy代理层

如图,proxy代理层,所有分片规则,所有分片逻辑,包括处理分布式事务都在mycat写好了,所有分片逻辑都是基于mycat方进行操作

jdbc直连层和proxy代理层优缺点

jdbc直连层性能高,只支持java语言,支持跨数据库

proxy代理层开发成本低,支持跨语言,不支持跨数据库

————————————————

版权声明:本文为CSDN博主「请叫我黄同学」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/ahuangqingfeng/article/details/124161107

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL-如何分库分表?一看就懂 的相关文章

随机推荐

  • ChatGPT在电子健康记录和医疗信息查询中的应用前景如何?

    电子健康记录 EHRs 和医疗信息查询在现代医疗保健系统中起着至关重要的作用 它们有助于提高患者护理的质量 提高医疗保健的效率 减少错误 促进患者参与 并促进医学研究和数据驱动的决策 ChatGPT作为一种人工智能技术 在这一领域具有巨大的
  • 关于vtk中的vtkActor、vtkRenderer、vtkRenderWindow的设置

    1 正常显示vtk 需要 vtkActor 可以有多个 进行一些演员的处理 vtkRenderer 可以有多个 将vtkActor进行加入 vtkRenderWindow 只能有一个 将vtkRenderer进行加入 vtkRenderWi
  • js 分浏览器设置style属性

    http www cnblogs com jianshao810 archive 2010 06 20 1761120 html var cssText font weight bold color red 下面写法用于firefox类型浏
  • 史上最牛,接口自动化测试-yaml框架配置文件总结(超级详细)

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系 七 常用自动化测试工具 八 JMeter性能测试 九 总结 尾部小
  • EasyUI项目之购物车功能

    前言 继续讲解EasyUi项目 网上书城 之加入购物车 清空购物车功能 码字不易 点个关注 转载请说明 开发工具 eclipse MySQL 目录 1 目标 2 代码展示 加入购物车 清空购物车 思维导图 实现购物车的三种方式 1 目标 加
  • adcsr图像超分代码_MMEditing: 多任务图像视频编辑工具箱

    我们近期在 OpenMMLab 项目中开源了 MMEditing 这是一个图像和视频编辑的工具箱 它目前包含了常见的编辑任务 比如图像修复 图像抠图 超分辨率和生成模型 在编辑图像或者视频的时候 我们往往是需要组合使用以上任务的 因此我们将
  • npm run build --report 不生成report分析文件原因

    运行 下面命令即可 命令行后缀参数需要多加 符号 npm run build report
  • C语言中文件操作,即文件打开,文件写入、文件读取、文件关闭

    1 文件读写前 必须先使用fopen函数打开文件 fopen 若要对文件进行读写操作 第一步需要使用fopen 函数fopen 函数用于打开指定路径的文件 获取指向该文件的指针 函数原型 func fopen brief 打开文件 para
  • k8s学习(十一)创建DaemonSet

    目录 前言 一 下载 fluentd elasticsearch 二 创建 DaemonSet 三 版本回退 四 指定 Node 节点 前言 DaemonSet 保证在每个 Node 上都运行一个容器副本 常用来部署一些集群的日志 监 控或
  • log4j2的JsonLayout测试

    log4j2的JsonLayout测试 工程开发 最近在开发通用的分布式日志采集器 碰到日志信息块的划分问题 尤其是碰到有异常堆栈的情况 需要做合并操作 当前我们的解决方案是使用日志块的起始时间来判断 有过萌生使用JsonLayout的想法
  • XCTF_very_easy_sql

    简单的进行sql注入测试后发现不简单 尝试一下按照提示 结合这句提示 应该是内部访问 所以采用的手段应该是ssrf 顺便看看包 唯一值得关注的是set cookie 说回ssrf 唯一能使用的方式应该是Gopher协议 找到了一个POST的
  • RS码(Reed-Solomon码)

    RS编码是一种多进制编码技术 适合于存在突发错误的通信系统 RS解码技术相对比较成熟 但由RS码和卷积码构成的级联码在性能上与传统的卷积码相比较提高不多 故在未来第三代移动通信系统采用的可能性不大 RS是 Reed Solomon 里德 所
  • Java中final关键字理解

    最近毕业面试 有几家都问到了final关键字的使用 谈到final关键字 想必很多人都不陌生 在使用匿名内部类的时候可能会经常用到final关键字 另外 Java中的String类就是一个final类 那么今天我们就来了解final这个关键
  • 服务器显示checkin,checkin.gstatic.com服务器iP

    2020 07 14 2021 08 08 203 208 50 162 2021 08 08 2021 08 08 142 250 186 131 2021 08 08 2021 08 08 142 250 72 131 2019 07
  • IPC:有名管道

    mkfifo chatA c 有名管道 FIFO namedPipe 提供了一个路径名相关联 以FIFO文件形式存在于文件系统中 FIFO的内容存放在内存 文件中没有内容 创建后可以read write close等 实现了任意不同进程间的
  • Registration based Few-Shot Anomaly Detection

    Registration based Few Shot Anomaly Detection paper https arxiv org abs 2207 07361 code https github com MediaBrain SJTU
  • 数值求解一维定态薛定谔方程

    背景 学习量子化学原理与应用课程时 一维定态薛定谔方程经常归结为解二阶偏微分方程 因此 学习数值解法一方面能够验证解析解 另一方面也能够应对更多更复杂的势垒函数对应方程的解 参考资料 https github com FelixDesroc
  • vue.js框架+mintUI 网站自建之挂件编写: 实现图片选择、预览和上传之后再从数据库读出并显示的一种方式

    网站上传图片 预览图片 加载图片的实现方法 文章结构 1 原始实现方法 2 更新 利用canvas重绘 优化加载速度 3 更新 canvas绘制在移动端与pc端的不同 19 4 28 4 28更新 对于4 27提出的想法现在出现一个问题 利
  • IDEA OutOfMemory(内存溢出)的问题解决

    1 idea编译时内存溢出 解决办法 打开设置界面 搜索Compiler 编译 如下图所示 将这个值设置为一个较大的值 2 运行时内存溢出 解决办法 打开tomcat设置页面 VM options加上参数 server XX PermSiz
  • MySQL-如何分库分表?一看就懂

    一 为什么要分库分表 如果一个网站业务快速发展 那这个网站流量也会增加 数据的压力也会随之而来 比如电商系统来说双十一大促对订单数据压力很大 Tps十几万并发量 如果传统的架构 一主多从 主库容量肯定无法满足这么高的Tps 业务越来越大 单