【MySQL进阶之路】MySQL 中的分库分表方案解决方案

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!

在我后台回复 「资料」 可领取编程高频电子书
在我后台回复「面试」可领取硬核面试笔记

文章导读地址:点击查看文章导读!

感谢你的关注!

在这里插入图片描述

MySQL 中的分库分表方案解决方案

如果在互联网公司中,可能有些表的数据规模膨胀速度很快,比如用户、订单数据,可能达到几千万甚至上亿级别的数据,那么数据量规模过大带来的性能负担是很重的,主要问题为:

  • 数据量大的问题 :MySQL 索引底层数据结构使用 B+ 树,如果单表数据量过大,会导致 B+ 树层级过深,磁盘 IO 次数增加,降低索引性能
  • 写性能瓶颈的问题 :在单机、主从架构中,如果是并发访问量很高的情况,尤其是写请求的 QPS 很高的情况下,很容易达到 MySQL 的性能瓶颈,只靠简单的主从架构,可以提升高可用和读性能,但是无法提升 MySQL 的写性能

因此需要对数据进行分片处理,来更好的解决这两方面的问题

如何分库分表?

对数据库进行分库分表时,是需要数据库的中间件支持的,比较常用的是:MyCat、Sharding-JDBC

  • MyCat 是 Proxy 层的解决方案,对应用来说比较透明,与应用之间耦合度较低,但是需要自己部署运维一套中间件,成本较高
  • Sharding-JDBC 是 client 层的解决方案,在应用端引入,运维成本较低,并且不需要 Proxy 层转发,性能较高,但是与应用端耦合度比较高,如果需要版本升级的话,代价比较大

所以,一般小型公司选用 Sharding-JDBC,中大型公司选用 MyCat

什么情况下需要分库分表呢?

比如说在互联网公司中,这里以电商场景举例,毕竟电商的用户量相对来说是比较大的

对于电商中的用户表来说,一般中小型的互联网公司,用户量可能就已经达到了几千万的级别,从而导致用户表的索引层次太深,查询能下降

一般建议 MySQL 中单表的数据量不要超过 1000 万,基本上单表数据量在 100 万以内,性能上不会出现太大的问题

因此对于用户量达到了几千万级别的用户表,需要进行分库分表!

将千万级别的用户数据分散到 100 个表中,user_001、user_002、…、user_100 一百个表,再将这 100 张表分散到多台服务器中去

至于具体分配多少台服务器主要看两个方面:

  • 看该表的压力有多大,用户表的话,压力一般不会太大,因为基本上不会出现同时间大量用户登陆注册的情况
  • 看该表的数据量有多大,有一个参考标准就是 1 亿条数据的总大小在 1GB - 几 GB 之间,该用户表中几千万的数据最多也就几个 GB,因此该量级的数据对服务器的压力并不大

所以说将这 100 个表分配到 2 台服务器即可,每台服务器上安装一个数据库,将 100 张表均匀分配在 2 台服务器上,一般指定表中的某一个字段来分,比如用户表中的 user_id 字段,对 user_id 进行哈希后,路由到对应的表中去

image-20240214234241092

分库分表后的适配问题

当进行分库分表之后,相应的应用端会出现一些业务上的问题,需要进行分库分表的适配处理,就比如:

  • 当根据用户表的 user_id 进行分库分表,那么当用户登录的时候,直接根据 user_account 进行登录,此时是没有 user_id 的值的,这时该如何查找对应的库和表呢?

常规解决方案的话是建立一个映射表(user_account -> user_id),通过 user_account 对这个映射表进行分库分表处理,之后就可以根据 user_account 找到映射表中对应的 user_id,再通过 user_id 去用户表中查询数据

虽然这种方式会带来一定的性能损耗,但是为了解决分库分表的问题,只能付出一定的性能代价

添加映射表之后,通过 account 查找用户数据如下图红线:

image-20240214234923167

分库分表后更复杂的查询问题

上边只说了简单的根据 user_account 查询用户数据所带来的问题,而实际场景中还有还需要根据用户名、手机号、性别等查询条件进行复杂查询,对于这类复杂查询来说,也没有太好的办法,只能对用户表数据的 binlog 进行监听,将要搜索的字段同步到 ES 中去,建立好搜索的索引,之后通过 ES 进行复杂查询,定位到对应的 user_id,再根据 user_id 去分库分表架构中查询对应的用户数据

因此,整套分库分表方案就说完了,基本上就包含了上边的几块内容

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

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

相关文章

话题——程序员为什么不喜欢关电脑?

程序员为什么不喜欢关电脑? 方向一:工作流程与需求 程序员的工作往往涉及长时间、连续的任务,如代码编写、调试、测试等。这些任务需要高度的集中和专注,而频繁地关机和重启可能会打断他们的工作流,导致他们需要重新…

猫头虎分享已解决Bug || DNS解析问题(DNS Resolution Issue):DNSLookupFailure, DNSResolveError

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

基于决策树的金融市场波动性预测与应用

基于决策树的金融市场波动性预测与应用 项目背景与意义数据概述与分析数据来源数据特征 数据预处理与特征工程模型训练与评估结果与应用总结 LightGBM是一个机器学习算法库,用于梯度提升机(Gradient Boosting Machine)的实现。梯度提升机是一…

如何书写一个标准JavaBean

前言:在学习Java类的三大特征之一的封装的时候,对封装的数据Java有着自己已经规定好的书写格式,我们需要按照对应的格式进行书写。 我们大致了解一下要学习的内容: 1.封装的概念 如图(看不懂没关系,下面会…

iTop-4412 裸机程序(二十二)- RTC时钟

目录 0.源码1. RTC2. iTop4412 中的 RTC使用的相关寄存器3. BCD编码4. 关键源码 0.源码 GitHub:https://github.com/Kilento/4412NoOS 1. RTC RTC是实时时钟(Real Time Clock)的缩写,是一种用于计算机系统的硬件设备&#xff0…

2024.02.12作业

1. 段错误 2. 段错误 3. hello 4. world 5. int a; int* a; int **a; int a[10]; int* a[10]; int(* a)[10]; int* a(int); int (*a[10])(int); 6. 6; 2; 2 7. 2 8. 2 9. b 10. a 11. a 12. c 13. b 14. c 15. a 16. c 17. b 18. a 19…

【2024年最新指南】掌握国内虚拟卡订阅midjourney的绝佳方法!轻松实现midjourney银行卡支付!(图文详解,简单易懂)

1.Midjourney介绍 Midjourney 是一款备受欢迎的人工智能生成图像工具,它可以通过输入文字描述,自动生成精美的图像。与许多其他图像生成工具不同,Midjourney 不需要安装任何软件,也不受个人电脑性能的限制,因为它运行…

「数据结构」MapSet

🎇个人主页:Ice_Sugar_7 🎇所属专栏:Java数据结构 🎇欢迎点赞收藏加关注哦! Map&Set 🍉概念🍉模型🍉Map🍌TreeMap和HashMap的区别🍌Map常用方…

第13章 网络 Page727~728 asio定时器例子:后创建的定时器先产生到点事件

代码: 35行,42行,51行,分别构造三个对象, 36行,43行,52行,设置了三个任务peng1、peng2、peng3,并将任务交给io_service对象(不需要ios的run()方法启动起来&a…

算法沉淀——队列+宽度优先搜索(BFS)(leetcode真题剖析)

算法沉淀——队列宽度优先搜索(BFS) 01.N 叉树的层序遍历02.二叉树的锯齿形层序遍历03.二叉树最大宽度04.在每个树行中找最大值 队列 宽度优先搜索算法(Queue BFS)是一种常用于图的遍历的算法,特别适用于求解最短路径…

文件上传-第三方服务阿里云OSS

JAVA后端实现文件上传,比如图片上床功能,有很多实现方案,可以将图片保存到服务器的硬盘上。也可以建立分布式集群,专门的微服务来存储文件常见的技术比如Minio。对于中小型公司,并且上传文件私密性不高的话可以使用第三方的存储服务,比如阿里云、华为云等…

【51单片机】一个简单的例子TMOD&TCON带你永远理解【(不)可位寻址】

前言 大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的《Linux》专栏YY的《数据…

【超级干货】ArcGIS_空间连接_工具详解

帮助里对空间连接的解释: 根据空间关系将一个要素的属性连接到另一个要素。 目标要素和来自连接要素的被连接属性写入到输出要素类。 如上图所示,关键在于空间关系,只有当两个要素存在空间关系的时候,空间连接才有用武之地。 一…

网站被劫持了怎么解决

网站被劫持是一种常见的网络安全问题,它通常表现为用户访问网站时被自动跳转到其他页面,这不仅影响用户体验,还可能对网站带来负面影响。面对这种情况,如何运用高技术手段来有效应对和防范网站劫持,成为了一个迫切需要…

【Linux学习】线程池

目录 23.线程池 23.1 什么是线程池 23.2 为什么需要线程池 23.3 线程池的应用场景 23.4 实现一个简单的线程池 23.4.1 RAII风格信号锁 23.4.2 线程的封装 23.4.3 日志打印 22.4.4 定义队列中存放Task类任务 23.4.5 线程池的实现(懒汉模式) 为什么线程池中需要有互斥锁和条件变…

MySQL学习记录——구 复合查询

文章目录 1、基本查询2、多表查询3、自连接4、子查询1、多行子查询2、多列子查询3、from句中的子查询 5、合并查询 1、基本查询 看一些例子,不关心具体内容,只看写法 //查询工资高于500或岗位为MANAGER的雇员, 同时还要满足他们的姓名首字母为大写的J …

Java图形化界面编程——AWT概论 笔记

2.3 Container容器 2.3.1 Container继承体系 Winow是可以独立存在的顶级窗口,默认使用BorderLayout管理其内部组件布局;Panel可以容纳其他组件,但不能独立存在,它必须内嵌其他容器中使用,默认使用FlowLayout管理其内部组件布局;S…

DOM事件练习1

DOM事件练习1 1. 演示效果 2. 分析思路 用 ul 创建四个 li 列表整个列表的背景是红色的,鼠标悬浮在列表上,一行的变为蓝色点击任意列表,整个列表的背景变为白色,被点击的列表变为粉色需要用到 js 的点击事onclick件和forEach循环…

【并发编程】ThreadPoolExecutor类

📝个人主页:五敷有你 🔥系列专栏:并发编程⛺️稳重求进,晒太阳 ThreadPoolExecutor 1) 线程池状态 ThreadPoolExecutor 使用 int 的高 3 位来表示线程池状态,低 29 位表示线程数量 状态名 高三位 …

网络安全威胁,如何解决缓冲区溢出攻击

目录 一、什么是网络安全 二、什么是缓冲区 三、缓冲区溢出 四、缓冲区溢出攻击的类型 一、什么是网络安全 网络安全(Network Security)指的是保护计算机网络及其相关设备、系统和数据免受未经授权访问、破坏、篡改、窃取或滥用的威胁和攻击。随着网…