深入浅出mysql分库分表

文章目录

    • 为什么要分库分表?
    • 什么场景下才需要分库分表?
      • 1. 数据量增长导致数据量过大--分表
      • 2. 高并发访问--分库
      • 3. 地理分散的业务--分库
    • 分库分表的区别
      • 分库(Database Sharding)
      • 分表(Table Partitioning)
    • 垂直拆分、水平拆分的区别
      • 垂直拆分(Vertical Partitioning)
      • 水平拆分(Horizontal Partitioning)
    • 浅谈

分库分表也是一个老生常谈的问题,很多人都习惯把分库分表放在嘴边,来显得高大上,其实我对于这点是非常不赞同的。先说明关键点:“ 非必要绝对不要进行分库分表

为什么要分库分表?

很多人总是第一反应说因为高并发,其实这个回答是非常不严谨的。我见过非常多的高并发系统都是单库单服务,照样跑的很稳定。其实分库分表的核心是**《数据库面临了性能瓶颈》**
所以分库分表是只有在数据库的性能处理能力确实满足不了当前情况,且已经很难靠业务进一步提升后,才采取的必要措施,如果性能满足的情况下,非必要绝对不要进行分库分表
因为分库分表一定会带来额外的复杂性和挑战,带来的成本也是巨大的

  1. 增加复杂性:开发者需要处理数据的分片逻辑、路由请求到正确的数据库实例等,这增加了开发和维护的难度
  2. 数据一致性问题:在分布式数据库环境中,保持数据的一致性是一个挑战。跨多个数据库实例的事务处理更加复杂,可能导致数据不一致的风险
  3. 事务管理困难:传统的数据库事务(ACID属性)在分库分表后变得难以实现。跨多个数据库的事务需要额外的协调机制,这可能影响性能
  4. 查询性能下降:虽然分库分表可以提高单个数据库的性能,但跨多个数据库的查询可能需要更多的协调和数据聚合,这可能导致整体查询性能下降
  5. 数据迁移和同步问题:数据迁移到新的分库分表架构可能非常复杂和耗时。此外,保持数据在多个数据库之间的同步也是一个持续的挑战
  6. 增加运维成本:管理多个数据库实例需要更多的运维工作,包括监控、备份、故障恢复等,这会增加运维成本
    虽然当前分库分表的技术已经相当成熟了,但是对于这个最终的选择仍然需要慎重

什么场景下才需要分库分表?

1. 数据量增长导致数据量过大–分表

这个应该很好理解,就是单表的存储的数据量超过一定的阈值,比如可能单表数据1000W条,或者可能占用了3-4G的磁盘,这个时候sql查询的性能会明显的下降,并且这个时候通过优化索引也没有办法很好的解决的情况下,这个时候就可以考虑用分表的方式将数据分散到多个表里面
这里通常采取的是横向拆分

这里的核心其实就是因为数据量的增多,导致B+树层数的增加,导致IO增加,引起性能下降。其实单表最多能记录多少条数据而不卡这个跟单条数据的大小也是有很大的关系的,具体业务具体分析,记住技术是为业务服务的,业务也倡导技术的发展

但是这里在最终确定选择这个方案前,可能还有其他考量,比如确定大量数据的原因,历史数据是否一定需要保存(比如起一个定时任务每天定时清理三个月前的数据)?是否可以直接删除或者存档es等来缓解单表数据量的压力,如果可以当然也没必要分表

2. 高并发访问–分库

单库的访问量过高,导致数据库压力过大,也是一个核心问题。这个可能也跟数据库机器的性能相关,对于机器好的服务来说,可能抗压能力更强,但是如果再高点比如7-8k qps,数据库的稳定性也面临着相当大的压力。这个时候就不是分表的问题了,这里应该是采用分库的方式,通过增加数据库的方式将访问的压力分散到多个数据库实例中,来提高整体的并发处理能力
一般的分库都是搭配微服务架构,常见的做法是根据业务的归属拆分不同的库,将不同的表拆分到不同的库中以达到专库专用,在降低风险的同时也减低了耦合度

3. 地理分散的业务–分库

这个比较少见,业务覆盖多个地区或国家,需要在不同地理位置提供服务,然后在地区本地部署服务以减少时延,或者某些地区的数据保护法规要求数据必须存储在本地等等,这里就不做扩充

分库分表的区别

分库(Database Sharding)

定义: 分库是指将数据分布到多个数据库实例中,每个实例可以是独立的数据库服务器或者集群。通常用于处理跨多个业务模块的大规模数据,适用于业务模块之间相对独立的场景
特点:

  • 每个数据库实例存储的数据是独立的,互不干扰
  • 可以针对不同的业务模块或数据类型进行分库
  • 通常用于解决单一数据库实例无法承载的数据量或并发请求量问题。

适用场景:

  • 业务模块之间关联性不大,可以独立存储和管理
  • 数据量或访问量非常大,单一数据库无法满足性能需求
  • 需要根据业务模块进行物理隔离,例如出于安全或合规性考虑

分表(Table Partitioning)

定义: 分表是指将单个表中的数据分割成多个子表,这些子表可以分布在同一个数据库实例中,也可以分布在不同的实例中。
特点:

  • 子表之间在逻辑上是连续的,但在物理上是独立的
  • 通常基于某种键值(如时间戳、ID范围)进行数据分割
  • 可以提高查询和更新的性能,尤其是在处理大量数据的表时

适用场景:

  • 表中的数据量非常大,单一表的维护和查询效率低下
  • 需要对数据进行逻辑上的分组,例如按照时间范围存储日志数据
  • 希望简化数据管理,例如通过分表来实现数据的自动归档和清理

垂直拆分、水平拆分的区别

垂直拆分(Vertical Partitioning)

定义: 垂直拆分是指根据数据表的列来拆分数据,将一个表中不常用的列或业务逻辑上相对独立的列拆分到不同的表或数据库中。垂直拆分是按列进行的,关注的是表的宽度。这个一般很少在系统后续优化中使用,除非是大规模的重构,一般会在数据库设计的初期就考虑好相关的问题。举例假设拆分一张用户表,将用户工号,用户名等关键字段放在主表,将性别,学历等其它字段放到子表,这样其实业务中用到这些字段的地方都需要修改,成本也是很高的
特点:

  • 减少了表的宽度,每个表只包含一部分列
  • 可以提高查询性能,因为查询时只需要访问相关的列
  • 有助于业务逻辑的分离,使数据库更加模块化

适用场景:

  • 当表中包含大量列,但查询通常只访问其中一小部分列时
  • 需要根据业务逻辑对数据进行分离,例如将用户信息和交易记录分开存储

水平拆分(Horizontal Partitioning)

定义: 水平拆分是指根据数据表的行来拆分数据,将数据按照某种规则(如范围、哈希等)分割到不同的表或数据库中。水平拆分是按行进行的,关注的是表的长度。水平拆分可以减少单表的数据量,提高查询和更新的性能,有助于根据数据的属性进行逻辑分组
特点:

  • 减少了单表的数据量,有助于提高单表的查询和更新性能
  • 需要考虑数据分片键的选择,以确保数据均衡分布
  • 可能需要跨多个表或数据库进行查询,增加了查询的复杂性

适用场景:

  • 当表中的数据量非常大,单一表难以有效管理时
  • 需要根据数据的某个属性(如时间、地区、用户ID)进行逻辑分组

浅谈

现在发展的很快,其实大部分的情况下,服务器的资源都是过剩的,就导致大部分的公司项目团队和开发根本不关心sql的性能问题,本着快速做完能跑就行去开发代码,或者直接干脆以空间换时间,采用高性能的机器扩容等即可。我见过太多的开发的sql非常浪费,优化空间巨大

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

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

相关文章

C++ 教程 - 08 文件操作与异常处理

文章目录 文件操作文件对象其他方法异常处理 文件操作 需要头文件 <iostream><fstream> 读取文件 ifstream obj; obj.open(const char* filename, std::in)写入文件ofstream obj; obj.open(const char* filename, std::out)读、写文件 fstream&#xff0c;包含了i…

免杀笔记 ---> PE

本来是想先把Shellcode Loader给更新了的&#xff0c;但是涉及到一些PE相关的知识&#xff0c;所以就先把PE给更了&#xff0c;后面再把Shellcode Loader 给补上。 声明&#xff1a;本文章内容来自于B站小甲鱼 1.PE的结构 首先我们要讲一个PE文件&#xff0c;就得知道它的结构…

MySQL之备份与恢复(四)

备份与恢复 存储引擎和一致性 3.复制 从备库中备份最大的好处是可以不干扰主库&#xff0c;避免在主库上增加额外的负载。这是一个建立备库的好理由&#xff0c;即使不需要用它做负载均衡或高可用。如果钱是个问题&#xff0c;也可以把备份用的备库用于其他用户&#xff0c;…

​香橙派AIpro测评:usb鱼眼摄像头的Camera图像获取

一、前言 近期收到了一块受到业界人士关注的开发板"香橙派AIpro",因为这块板子具有极高的性价比&#xff0c;同时还可以兼容ubuntu、安卓等多种操作系统&#xff0c;今天博主便要在一块832g的香橙派AI香橙派AIpro进行YoloV5s算法的部署并使用一个外接的鱼眼USB摄像头…

小龙虾优化24种机器学习多输入单输出回归|时序预测模型

小龙虾优化24种机器学习多输入单输出回归|时序预测模型 文章目录 小龙虾优化24种机器学习多输入单输出回归|时序预测模型前言一、小龙虾优化基本原理二、优化机器学习模型1.COA-CNN-BiGRU-Attention回归模型2.基于小龙虾优化支持向量机的数据回归预测Matlab程序COA-SVM 多特征输…

Android EditText的属性与用法

EditText 是编辑框控件&#xff0c;可以接收用户输入&#xff0c;并在程序中对用户输入进行处理。EditText在App里随处可见&#xff0c;在进行搜索、聊天、拨号等需要输入信息的场合&#xff0c;都可以使用 EditText。 图1 编辑框示意图 EditText 是TextView的子类&#xff0c…

sql语句练习注意点

1、时间可以进行排序&#xff0c;也可以用聚合函数对时间求最大值max&#xff08;时间&#xff09; 例如下面的例子&#xff1a;取最晚入职的人&#xff0c;那就是将入职时间倒序排序&#xff0c;然后limit 1 表&#xff1a; 场景&#xff1a;查找最晚入职员工的所有信息 se…

【unity实战】使用Unity实现动作游戏的攻击 连击 轻重攻击和打击感

最终效果 文章目录 最终效果前言素材下载&#xff1a;玩家移动跳跃控制攻击动画配置轻攻击重攻击 攻击时禁止移动和攻击移动补偿敌人击退和播放受击动画受击特效攻击停顿和屏幕震动局部顿帧&#xff08;补充&#xff09;参考源码完结 前言 注意本文为自己的学习记录笔记&#…

日志自动提取---七牛Logkit观星应急工具

目录 七牛Logkit (Windows&Linux&Mac 等) 下载: 文档: windows配置过程: 1-下载 2-修改logkit-community基本配置 3-启动! 4-浏览器访问 5-添加配置吧 观星应急工具 &#xff08;Windows 系统日志&#xff09; 七牛Logkit (Windows&Linux&Mac 等) -…

WCCI 2024第三弹:忍者表演惊艳全场,盛大晚宴不容错过

WCCI 2024第三弹&#xff1a;忍者表演惊艳全场&#xff0c;盛大晚宴不容错过&#xff01; 会议之眼 快讯 会议介绍 IEEE WCCI&#xff08;World Congress on Computational Intelligence&#xff09;2024&#xff0c;即2024年IEEE世界计算智能大会&#xff0c;于6月30日至7月…

React@16.x(47)路由v5.x(12)源码(4)- 实现 Route

目录 1&#xff0c;原生 Route 的渲染内容2&#xff0c;实现 1&#xff0c;原生 Route 的渲染内容 对如下代码来说&#xff1a; import { BrowserRouter as Router, Route } from "react-router-dom"; function News() {return <div>News</div>; }func…

使用SSE实现echarts数据实时更新

区别 SSE 和 WebSocket 原理和实现方式的区别 SSE( Server-Sent Events) SSE 是基于传统的 HTTP 协议实现的&#xff0c;采用了长轮询&#xff08;long-polling&#xff09;机制。客户端通过向服务器发送一个 HTTP 请求&#xff0c;服务器保持连接打开并周期性地向客户端发送…

NoSQL之Redis高可用与优化

一、Redis高可用 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。 但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;除了保证…

Android adb logcat日志过滤输出

Android adb logcat日志过滤输出 adb logcat 输出所有Android设备上的日志。 adb logcat *:Error 过滤输出日志级别只为Error的日志。 过滤某些标签或tag&#xff0c;依次执行: adb shell logcat grep | "你的标签或tag" Android Studio level过滤查看各个等级的日志…

Oracle连接mysql

oracle使用的11g&#xff0c;在一台windows服务器&#xff1b;mysql使用的是5.7版本&#xff0c;在另一台windows服务器&#xff0c;这两个服务器之间的网络是互通的。做BI时&#xff0c;要获取不同数据源的数据&#xff0c;这些数据源可能是Oracle&#xff0c;也可能是sqlserv…

股票分析-20240628

今日关注&#xff1a; 20240626 六日涨幅最大: ------1--------300386--------- 飞天诚信 五日涨幅最大: ------1--------300386--------- 飞天诚信 四日涨幅最大: ------1--------300386--------- 飞天诚信 三日涨幅最大: ------1--------300386--------- 飞天诚信 二日涨幅最…

【pytorch14】感知机

单层感知机模型 对于单层的感知机&#xff0c;它的激活函数是一个sigmoid 对于符号的定义做一个规范化&#xff0c;输入层每一层进行一个编号 输入是第0层&#xff0c;上标0表示属于输入层&#xff0c;下标0到n表示一共有n个节点(这里严格来说应该是0~n-1&#xff0c;为了书写…

Zoom使用的基本步骤和注意事项

Zoom是一款功能强大的视频会议软件&#xff0c;广泛应用于远程办公、在线教育、团队协作等多个场景。以下是Zoom使用的基本步骤和注意事项&#xff1a; 一、注册与登录 注册Zoom账户&#xff1a; 访问Zoom官方网站&#xff08;如zoom.us&#xff09;&#xff0c;点击“注册”…

Games101学习笔记 Lecture16 Ray Tracing 4 (Monte Carlo Path Tracing)

Lecture16 Ray Tracing 4 (Monte Carlo Path Tracing 一、蒙特卡洛积分 Monte Carlo Integration二、路径追踪 Path tracing1.Whitted-Style Ray Tracings Problems2.只考虑直接光照时3.考虑全局光照①考虑物体的反射光②俄罗斯轮盘赌 RR &#xff08;得到正确shade函数&#x…

精准畜牧业:多维传感监测及分析动物采食行为

全球畜牧业呈现出一个动态且复杂的挑战。近几十年来&#xff0c;它根据对动物产品需求的演变进行了适应&#xff0c;动物生产系统需要提高其效率和环境可持续性。在不同的畜牧系统中有效行动取决于科学技术的进步&#xff0c;这允许增加照顾动物健康和福祉的数量。精准畜牧业技…