MySQL的分库分表

news2024/11/22 13:30:38

分必要不要分库分表(通过优化之后还明显影响业务再分,可以通过监控慢查询确定)

分库分表的一般条件:单表数据量超过1000w(阿里应该是说5000w)或者单表数据文件(.ibd)超过20GB,这个很重要,(很多年前我没怎么用过数据库的时候面试某著名大厂,让我等最后的谈钱不伤感情(他们hr不挂人),大领导对我非常满意,就跟我闲聊技术,就因为瞎XX聊天的时候说了一个过200w要分库分表的笑话,就从等待谈钱不伤感情到回去等通知吧,到手的offer没了,所以没事不要开玩笑。。。。。。)

 范围分片存在的问题:

(1)尾部热点:根据表自增的测量,可能之后的数据都会插入到最后一个分片上,而且因为最后一个分片都是最新的数据,最可能被查询(正常的话今年的数据被查询的可能性较大,而去年前年的数据被查询的可能性就较小)

(2)数据倾斜,因为是按照主键自增的策略,所以前面两个库的数据都放满的情况下才会放第三个库,而第三个库可能刚放了200w的数据,这个时候数据就出现了倾斜,每个库处理的压力不一样。

(3)资源浪费,如果是范围分片的话,我们可能提前规划了某个分片需要存储5000w的数据,但是我们的硬件足够强大,可以处理1亿的数据,那这多出来的5000w的硬件能力就浪费了

与之对应的Hash分表基本能保证数据的总量基本一致(不倾斜、无资源浪费)数据分布均匀(无尾部热点问题),那Hash分别有什么问题呢,我们举个例子,对于上面图中,如果我们要查询的是id>8,则需要在每一个分片执行这个语句,然后再进行综合,也就是存在跨库查询问题。

那什么时候使用范围什么时候使用Hash分片呢?

如果表中存储的是类似日志数据这种的话,可能只会关心最近产生的,所以采用范围分片是个比较好的选择。

如果开发的是类似于档案系统,需要根据档案编号来进行查找指定的数据,那采用hash就可以快速定位到对应的分片进行数据提取且每个分片比较平均,采用hash就是一个比较好的选择

对于最开始的系统,我们数据量不大的时候基本上单独单表的

单库多表:有效缩小磁盘扫描的范围(按范围或者hash),可以很快的提取对应的数据,必须上面的图中查询id为300000001的那条数据,但是瓶颈是物理机的磁盘、网络IO、CPU的上限

多库多表:不同的数据库部署到不同的物理机上,提供数据库的并行处理能力,在复杂的系统中基本上都采用这种方案。

分库分表可能产生的问题:

1.分布式事务问题,引入XA、TCC、SAGA等分布式事务解决方案,原来数据都在一张表里,我们使用一个事务就可以保证事务的完整性一致性,但是现在数据可能分布在多个表甚至多个库里,那就需要引入额外的事务协调者,如引入XA、TCC、SAGA等分布式事务解决方案。

2.跨库join关联查询

解决方案:(1)程序先查A表,再查询B表(程序自己来实现)

(2) 使用MyCat、ShardingSphere等组件来支持两个表的跨度join(注意目前应该只支持两个表的,或许是我的知识局限了),跟第一个方案差不多,逻辑被组件封装了

3. 跨节点分页查询问题

比如top n问题,我们的解决方案目前是每个节点取top n,然后在程序合并运算取这些所有取到的数据里的topn,Mysql目前没有找到更好的方案。

4.全局主键ID问题

因为每一条数据的ID都是不能重复的。

采用分布式主键生成器,例如推特的SnowFlake(国内叫雪花,存在著名的服务器时钟回拨的问题:时钟回拨是与硬件时钟和ntp服务相关的。硬件时钟可能会因为各种原因发生不准的情况,网络中提供了ntp服务来做时间校准,做校准的时候就会发生时钟的跳跃或者回拨的问题)、美团的Leaf,不建议使用UUID,原因是:1.UUID是字符串,处理字符串比处理数字的效率要明显偏低 2. 

UUID是无序的,无序的主键可能发生页分裂问题进而影响程序的执行效率

5.扩容问题

范围分表容易扩容,最后的数据存在于最后的节点上,如果 容量不够只需要在最后再添加服务器即可,但是存在尾部热点问题,最后的服务器读写压力可能最大

Hash分表极难扩容(涉及大规模的数据迁移,例如某条数据原来对4取模放在3号分片,而现在改成对于5取模可能就放在2号分片了),可能的策略是改为一致性的Hash,但是迁移难度也是比较大的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

点云配准综述一篇综述《A comprehensive survey on point cloud registration》(翻译)

参照了 2021最新关于点云配准的全面综述 - 知乎,并且加了些自己翻译,全篇的内容可能稍有删减。主要作为个人笔记,阅读了几篇综述,发现这篇是质量较好的,值得花时间细读。 文章分类 文章将配准方法分为了同源配准和不…

JMeter三大重要组件——线程组、取样器、查看结果数(3)

JMeter三大重要组件 一、JMeter三大重要组件——线程组1、作用:JMeter主要通过线程组来运行用户脚本2、在取样器错误后要执行的动作:3、线程属性3、调度器4、setUp线程组和tearDown线程组 二、JMeter三大重要组件——取样器1、基本a、自动重定向和跟随重…

Obsidian多端同步插件LiveSync

网友 Leo 和 Paco反馈,群晖升级到 DSM7.2 ,注册表可以搜索镜像,根据 Leo 贴的 /var/packages/Docker/etc/dockerd.json 的内容,DSM7.2 应该是使用了 https://docker.nju.edu.cn 作为注册表镜像,但老苏测试过下面几种情…

易基因:易基因近期染色质免疫共沉淀测序(ChIP-seq)研究成果|项目集锦

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 在生物学研究中,DNA与蛋白质之间的互作(DNA-Protein Interactions,DPIs)是至关重要的,参与基因的表达、调控、复制、重组和修复…

m 序列(最长线性反馈移位寄存器序列)详解

本专栏包含信息论与编码的核心知识,按知识点组织,可作为教学或学习的参考。markdown版本已归档至【Github仓库:https://github.com/timerring/information-theory 】或者公众号【AIShareLab】回复 信息论 获取。 文章目录 m 序列 (最长线性反…

Git进阶系列 | 8. 用Reflog恢复丢失的提交

Git是最流行的代码版本控制系统,这一系列文章介绍了一些Git的高阶使用方式,从而帮助我们可以更好的利用Git的能力。本系列一共8篇文章,这是最后一篇。原文:Using the Reflog to Restore Lost Commits[1] “Reflog”是Git不太为人所…

常见的未授权漏洞批量检测工具

常见的未授权漏洞检测 命令行版已放出支持多线程,批量扫描,指定服务扫描,命令行版地址https://github.com/xk11z/unauthorized_com GUI版unauthorizedV2已更新,可批量ip检测导出结果 项目包含 1 、FTP 未授权访问&#xff08…

SadTalker AI模型使用一张图片与一段音频便可以自动生成视频

SadTalker模型是一个使用图片与音频文件自动合成人物说话动画的开源模型,我们自己给模型一张图片以及一段音频文件,模型会根据音频文件把传递的图片进行人脸的相应动作,比如张嘴,眨眼,移动头部等动作。 SadTalker,它从音频中生成 3DMM 的 3D 运动系数(头部姿势、表情),…

webstorm配置vue开发环境

🌳🌳🌳前言:本文章针对于如何用IDE和webstorm运行一个别人的vue项目进行步骤记录。 📙参考:(10条消息) idea配置vue开发环境_idea配置vue运行环境_drinkworld的博客-CSDN博客https://blog.csdn.net/drinkwo…

VSCode ssh ubuntu20显示图像界面

1、在vscode中安装 Remote X11(SSH) 2、在本地端安装MobaXterm 点击Settings-->Configurations-->X11,设置如下: 3、在服务端修改 ~/.bashrc文件,在末尾添加 export DISPLAY"192.168.0.201:0.0" 其中引号中内容为本地端IP地…

英伟达股价能否凭借AI进一步上涨到500美元?

来源: 猛兽财经 作者:猛兽财经 猛兽财经在之前的关于英伟达的分析中(5月2日),就认为英伟达在人工智能方面的增长潜力还没有完全释放出来,并认为英伟达的股价将会很快涨到300美元,结果到了6月…

代码随想录二刷 day34 | 贪心之1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果

1005.K次取反后最大化的数组和 题目链接 解题思路: 两次贪心 如何可以让数组和最大呢? 局部最优:让绝对值大的负数变为正数,当前数值达到最大,整体最优:整个数组和达到最大 如何转变K次正负,让…

CASS打印地形图操作

1、打开地形图,如下: 2、在“工程应用”菜单栏中,选择“查询两点距离及方位”,如下: 3、量取地形图的大致范围大小,如下: 读取图上距离,用于设置纸张大小。 4、点击左上角打印图形&…

【算法题】神奇的斐波那契数列(Fibonacci sequence)、青蛙跳台阶问题、矩阵中的路径

神奇的斐波那契数列和青蛙跳台阶问题 一、神奇的斐波那契数列1.1、题目描述1.2、递归算法1.3、迭代法1.4、小结 二、青蛙跳台阶问题2.1、题目描述2.2、思路2.3、动态规划法2.4、小结 三、矩阵中的路径3.1、题目描述3.2、思路3.3、代码实现3.4、小结 总结 一、神奇的斐波那契数列…

卫星地图应用经典实例项目(7个)

本文会介绍引用一些非常好的卫星地图等相关的应用,一方面给大家增加见识,另一方面会提供一些设计开发的思路以及代码。 文章目录 热气球追踪系统googlemap实现卫星轨迹satvis卫星Cesium系统NASA的worldview系统项目Esri-Satellite-Map基于leaflet的卫星轨迹绘制项目地球当前…

关于Altium Designer 差分线规则设置的方法纠偏

本文适用于AD20以后版本。在AD的原理图及pcb的4年设计学习中,入门课是学校的AD09,简单的两层板绘制。后来因工作需要,就报了培训班,学习了基于AD19的相关使用方法。后来在很多的项目开发中,逐渐发现之前从书本、培训课…

Qt QGraphicsScene模块实现圆点绘制在所有窗体的最前方,实现圆点的“彩色拖尾”效果以及“选中方框”效果

文章目录 前言1、效果2、代码实现2.1 思路2.1.1 “拖尾”效果2.1.2 “选中方框区域”效果2.2 代码 总结 系列文章: (一)Qt 将某控件、图案绘制在最前面的方法,通过QGraphicsScene模块实现 (二)Qt QGraphics…

【SCI/SSCI/EI录用案例】仅26天录用,1天见刊

【Unionpub学术】录用/见刊/检索案例:2023年6月10日-2023年6月16日 2区材料类SCI 【期刊简介】IF:3.5-4.0,JCR2区,中科院3区 【检索情况】SCI 在检,正刊 【征稿领域】降解材料及其相关技术的研发,如聚合物基轻质材…

PyTorch 2简介:卷积神经网络

介绍 在本系列的上一部分中,我们使用了CIFAR-10数据集,并介绍了PyTorch的基础知识: 张量及其相关操作数据集和数据加载器构建基本的神经网络基本模型的训练和评估 我们为CIFAR-10数据集中的图像分类开发的模型只能在验证集上达到53%的准确率&…

Observability:为 Logstash 输出配置 SSL/TLS - Elastic Agent

在我之前的文章 “Observability:如何把 Elastic Agent 采集的数据输入到 Logstash 并最终写入到 Elasticsearch”,我详细介绍了如何使用 Elastic Agents 采集数据并把数据通过 Logstash 发送至 Elasticsearch。细心的开发者可能注意到从 Elastic Agents…