当前位置: 首页 > news >正文

MySQL的分库分表?通俗易懂

1- 为什么要分库分表

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

2- 什么是分库分表

分库分表方案是对关系型数据库数据存储和访问机制的一种补充。
分库:将一个库的数据拆分到多个相同的库中,访问的时候访问一个库
分表:把一个表的数据放到多个表中,操作对应的某个表就行

3- 分库分表的几种方式

在这里插入图片描述

3.1- 数据库垂直拆分

在这里插入图片描述
根据业务拆分,如图,电商系统,拆分成订单库,会员库,商品库

3.2- 表垂直拆分

在这里插入图片描述
根据业务去拆分表,如图,把user表拆分成user_base表和user_info表,use_base负责存储登录,user_info负责存储基本用户信息

垂直拆分特点

  1. 每个库(表)的结构都不一样
  2. 每个库(表)的数据至少一列一样
  3. 每个库(表)的并集是全量数据

垂直拆分优缺点
优点:

  1. 拆分后业务清晰(专库专用按业务拆分)
  2. 数据维护简单,按业务不同,业务放到不同机器上

缺点:

  1. 如果单表的数据量大,写读压力大
  2. 受某种业务决定,或者被限制,也就是说一个业务往往会影响到数据库的瓶颈(性能问题,如双十一抢购)
  3. 部分业务无法关联join,只能通过java程序接口去调用,提高了开发复杂度

3.3- 数据库水平拆分

在这里插入图片描述
如图,按会员库拆分,拆分成会员1库,会员2库,以userId拆分,userId尾号0-5为1库
6-9为2库,还有其他方式,进行取模,偶数放到1库,奇数放到2库

3.4- 表水平拆分

在这里插入图片描述
如图把users表拆分成users1表和users2表,以userId拆分,进行取模,偶数放到users1表,奇数放到users2表

水平拆分的其他方式

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

水平拆分特点

  1. 每个库(表)的结构都一样
  2. 每个库(表)的数据都不一样
  3. 每个库(表)的并集是全量数据

水平拆分优缺点
优点:

  1. 单库/单表的数据保持在一定量(减少),有助于性能提高
  2. 提高了系统的稳定性和负载能力
  3. 拆分表的结构相同,程序改造较少。

缺点:

  1. 数据的扩容很有难度维护量大
  2. 拆分规则很难抽象出来
  3. .分片事务的一致性问题部分业务无法关联join,只能通过java程序接口去调用

4- 分库分表带来的问题

  1. 分布式事务
  2. 跨库join查询
  3. 分布式全局唯一id
  4. 开发成本 对程序员要求高

5- 分库分表技术如何选型

分库分表的开源框架
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代理层开发成本低,支持跨语言,不支持跨数据库
http://www.lryc.cn/news/35150.html

相关文章:

  • elasticsearch 查询语法
  • 深入剖析MVC模型与三层架构
  • 使用 Wall 搭建个人照片墙和视频墙
  • 03_Linux压缩解压,用户用户组,文件权限
  • 硬盘分区数据恢复?这些方法助您解忧
  • 高校竞赛信息管理系统
  • 还是要学好数学啊
  • ActiveMQ反序列化漏洞原理+复现
  • layui框架实战案例(19):layui-table模块表格综合应用(筛选查询、导入导出、群发短信、一键审核、照片展示、隐私加密)
  • 分析vmlinux,uImage,zImage,Image的生成以及之间的关系
  • 设计模式-六大设计原则详解(java 版)
  • Linux下Nginx安装使用
  • 推动汽车业务向前发展的混合云战略:汽车数据解决方案
  • Boosting三巨头:XGBoost、LightGBM和CatBoost(发展、原理、区别和联系,附代码和案例)
  • 设计模式~模板方法模式(Template method)-10
  • 【WebSocket】在SSM项目中配置websocket
  • node-red中创建自定义节点 JavaScript 文件API编写详解
  • 华为OD机试 - 寻找路径 or 数组二叉树(C 语言解题)【独家】
  • YOLOv7、YOLOv5改进之打印热力图可视化:适用于自定义模型,丰富实验数据
  • 【Java代码与架构之完美优化】篇1:代码质量优化通用准则
  • Linux进程间通信详解(最全)
  • ROS 摄像头的使用
  • VR全景云展厅,实现7*24小时的线上宣传能力!
  • RK3568平台开发系列讲解(显示篇) DRM显示系统组成分析
  • WPF DataGrid控件的使用 使用列模板来进行数据格式的美化
  • elasticsearch自定义企业词典
  • 【AcWing】学了一坤时才明白的一道题
  • ES6的export和import
  • ASEMI高压MOS管20N60参数,20N60尺寸,20N60体积
  • 【备战面试】TCP的三次握手与四次挥手