天天快播:MySQL单表数据量大于2000W行 性能会明显下降吗?
在互联网技术圈中有一个说法:「MySQL 单表数据量大于 2000 W行,性能会明显下降」。网传这个说法最早由百度传出,真假不得而知。但是却成为了行业内一个默认的标准。
一、单表最大到底能存多少数据
【资料图】
先来看看下面这张图,了解一下mysql各个类型的大小
我们知道在MySQL是支持主键自增长的,不考虑其他因素的前提下,理论上只有主键没有用完,表中的数据就可以一直增加。从上图可以中可以分析出:
「主键类型为Int时」
主键32位,数据最大为2^32-1,大约可以存储21亿的数据,远远大约2KW。
「主键类型为bigint时」
主键64位,数据最大为2^64-1,存储的数据远远大于了常用的计量单位了,磁盘都达不到这个数量级。
「主键类型为tinyint时」
主键8位,数据最大为255,Id自增超过255就会报错
「由此可見:MySQL能够存储的数据在一定程度上受限与主键的类型。但是数据量的大小却跟2000W没啥影响,既然百度大佬推荐单表最大2000W行数据,那肯定不会是空口白话,一定定会有其他影响行数的因素」。
二、数据存储的结构
先不要着急,影响数据行数的因素肯定是有的,在此之前,先来看看数据在InnoDB中是怎么存储在磁盘的,又是怎么读取的。
2.1 数据存储的结构
在MySQL中默认的存储引擎是InnoDB,在之前的《存储引擎》中有说过,InnoDB为每个表都生成了两个文件:
.frm文件:表结构文件.ibd文件:数据文件(聚簇索引包含数据与索引),又叫「表空间」。
我们表中的的数据其实都是存储在磁盘的.ibd文件中,而每次读取整个.ibd文件无疑是非常慢的,所以在《InnoDB数据文件》中又提到,「InnoDB将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为 16KB」。如下
从上图中可以很清晰的看出,「一个.ibd文件文件是由多个数据页组成的,也就是说一个表的数据会被分散存储在多个数据页中」。当然数据页也不仅仅只是存储表中的数据,先来回顾一下页的组成
「页的组成」
如图所示,InnoDB数据页由以下七个部分组成,
从也得组成中我们知道,「数据页中还存储了除数据之外的东西,比如数据页的前后指针,页号,页目录等,因此虽然一个数据页一共16KB,但是能够用来存储数据的其实是不足16KB的」。
通过页的组成,我们可以大致分析在数据页中一下「查找数据的整体过程」:
记录被分散在不同的数据页中,InnoDB通过「页号【表空间的地址偏移量】来标识数据具体在哪一页中」。不通的数据页之间使用「前后指针」进行关联,避免检索消耗,当找到数据在那个数据页之后,InnoDB为避免遍历检索而提供了一个「页目录」,页目录通过「二分查找」将查找效率「从O(n) 变成O(lgn)」,从而快速定位数据的位置。
2.2 索引的结构
既然在.ibd文件中只要知道了页号,就可以快速定位数据行的位置,从而读取到相应的数据。那么问题来了,我咋知道我要找的数据在那个数据页里,咋知道页号是啥?
万事都有解决的方式,要知道页号其实也简单,无非就两种方式:
「全表扫描」:简单粗暴,没那么多花花肠子,干就完事,但是「数据量大了,性能就会下降,非长久之计」。「通过索引找到数据页」:重点了解一下这个
在《索引基本原理》中解释了InnoDB索引是基于B+tree实现的,InnoDB在构建B+tree结构时,一般会找出每个数据页中id最小(或者说索引最小, InnoDB主键即聚簇索引)的记录与其对应的页号,「将id与页号组成一个新的记录,存储在一个新生成的数据页中,其大小也为16K,为与存储数据的数据页区分,引入了数据页之间的上下层级关系」,也就是「页层级(page level)」。因此我们知道在B+tree中分为两部分:
「叶子节点」:真正存放表中的数据的数据页,page level = 0「非叶子节点」:存放索引以及索引对应数据所在的页号的数据页
根据这张B+tree的图,我们知道数据页之间是有地址指向的,如果要找一条数据,最多只需要经历三次「磁盘IO」就可以将数据页都加载到内存中,从而找到数据,完成查询。
三、B+Tree能存储多少数据
要知道一个B+Tree能存储多少数据其实也不难,B+Tree中的叶子节点存放的是数据,而一个数据页只有16K,我们「假设:数据页中页目录,页头,页尾加起来总共占用1KB,剩余15KB全部用了存放数据」。
如上图:
将B+tree的高度定义为N非叶子节点的数据页存储数量为X,也就是有X个数据页的页号叶子节点的数据页存储数据为Y
根据以上定义,B+tree存储的数据总量:「M ={X ^ (N-1)} * Y」
前文中我们说到主键类型会影响行数,那么此时我们「假设主键类型为bigint类型,占8个字节,而在InnoDB源码中页号(FIL_PAGE_OFFSET)被设置为4字节」。则此时非叶子节点能存储的数据量为
「X = 15 * 1024 / (8 +4) = 1280」
「基于此:在来做一个假设,假设叶子节点中存储的数据,每条的大小都为1KB,即每个数据页存储15条数据。」
「Y = 15」
现在来看看B+tree的数据量
「两层B+tree的数据量(N=2)」
「M = {X ^ (N-1)} * Y = {1280 ^ (2-1)} * 15 = 19200 条」
「三层B+tree的数据量(N=3)」
「M = {X ^ (N-1)} * Y = {1280 ^ (3-1)} * 15 = 24579000条」
「四层B+tree的数据量(N=4)」
「M = {X ^ (N-1)} * Y = {1280 ^ (4-1)} * 15 = 计算器都算不清楚了」
「从这里的24579000条,我们就知道为啥单表不推荐超过2000W了,三层B+tree的时候最多只有三次磁盘IO,四层的时候数据量太大,磁盘可能都造不住了」。
四、啥时候能超过2000W的数据
不知道大家有没有注意到一点,在上面计算中,我们都是做了很多假设,其中就有一条:「假设叶子节点中每条数据占用1KB,以此得出一个数据页的数据量Y=15」。
在实际中,要是我一行的数据非常小,仅仅只占用了100KB(比如一个中间表,记录的仅仅是ID),此时
「叶子节点数据页的数据量」
「Y = 15 * 1024 / 100 = 153」
「三层B+tree的数据量」
「M = {X ^ (N-1)} * Y = {1280 ^ (3-1)} * 153 = 250675200条」
「同样是三层B+tree,此时却可以存储2.5亿条数据,增长十倍,但是查找同样只需要三次磁盘IO,并不会对性能有太大影响」。
这里说的「是【叶子节点】数据页的数据行大小」影响了最终存储的数据总量,「实际上【非叶子节点】的数据页存储数量X的大小变化的时候」,也会影响数据总量,但是这种影响一般会在B-tree中体现。
我们知道B-tree跟B+tree最大的区别就是「B-tree的非叶子节点中存储的是真实的数据行,而数据页的大小是16KB固定的,因此相同数据下,B-tree需要更多数据页才能存储数据,数据页增多势必会造成非叶子节点的层级变高,造成更多的磁盘IO,导致性能下降」。这也是InnoDB使用B+tree作为索引结构,而不用B-tree的原因。
「总结」
这里总结一下前文中提的问题「其他影响行数的因素」?现在就很清晰了,除了主键大小和磁盘限制,最重要的就是索引的结构,即B+tree。
标签:
相关推荐:
最新新闻:
- 如何成为一名优秀的产品经理?这四步很重要
- 天天简讯:userdata.dll丢失怎么办?解决方法来了
- 怎么设置excel2007冻结窗口?excel2007冻结窗口设置方法:环球热消息
- 天天快资讯丨欧几里德几何的多目标优化自适应进化算法——AGE-II
- 天天快播:MySQL单表数据量大于2000W行 性能会明显下降吗?
- 天天速讯:【数据分析】如何快速实现API和数据接口的调用?
- 固态存储设备要擦除哪些数据的SATAm指令?详情介绍 环球快报
- Delphi多线程同步处理方案 delphi多线程详解及其详解例子|环球热资讯
- 永恒之塔无法连接到认证服务器怎么办?解决方法步骤
- SSD的TRIM功能有什么作用?固态存储设备要擦除哪些数据的SATAm指令?
- 科技创新赋能美好出行 雅迪助力电动车行业高质量发展
- 天涯明月刀:1月第1批天涯合璧-数据互通(合服)即将启动-环球新资讯
- 世界快消息!天堂2服务端服务器名字修改?制作天堂2鼠标指针和蓝色长方形条的教程
- SIS与ESD、DCS、PLC,四者之间有什么关系?一文读懂SIS与DCS的关系:新动态
- 如何发布一个BT种子文件?2个步骤搞定
- 泛海微无线电动牙刷怎么样?无线充电电动牙刷技术介绍 天天讯息
- 《魔兽世界》所改编的网络游戏单机版 你玩过吗?
- 冬季家用洗碗机怎么样?家用洗碗机使用特点
- 斗鱼看不到弹幕怎么办?斗鱼无法看到弹幕的解决方法
- 徕卡镜头有哪些型号?徕卡镜头大全以及报价镜头 每日看点
- 世界速讯:java中的TCP是什么?如何进行通讯?
- 求生之路2怎么局域网联机?局域网联机方法详解
- 三星S5660手机配置怎么样?三星S5660如何设置时间和日期?
- 当前热门:多普达手机如何鉴别?多普达手机行货验证介绍
- 世界今亮点!QQ网络硬盘在哪?如何添加QQ界面?
- 对象优先在eden区分配内存吗?堆中分配内存的对象有哪些?
- 每日视讯:Sora套装 迪卡侬入门公路3949元
- 当前报道:如何设置默认浏览器?谷歌浏览器设置默认Tip流程
- 焦点速递!什么是SEM?SEM和SEM有什么区别?
- 世界短讯!【pycharm】1.8.0+cuda111的运行环境
- 599美元香吗?RTX4070价格泄露
- 今日热搜:华为g525可以刷鸿蒙系统吗?华为g525强刷官方rom系统的教程
- 戴尔笔记本电脑多少钱?戴尔笔记本电脑价格大全 热消息
- 环球快资讯:网站服务器如何防御ddos攻击?教你一招
- ChatGPT对手 Bard将大幅度升级_环球热点评
- 焦点快看:CSS文件中的中文字体名称怎么写?CSS常用的中文字体名称对照表
- 天天简讯:联想ThinkPad有哪些型号?联想ThinkPad各系列型号介绍
- 时讯:ppt中的控件工具箱——ShockwaveFlash
- 热推荐:动态语言:C、PHP、Perl、Ruby哪个更适合你?
- 安卓设备的USB周边和安卓USB配件如何调试?具体操作方法
- 每日短讯:什么是视频会议系统?视频会议的发展及标准有哪些?
- qq字体怎么设置?qq聊天字体设置教程-天天热议
- CCFL是什么?CCFL背光屏有哪些优缺点?|当前视讯
- 焦点热讯:iPhone5怎么升级ios7?8款苹果设备升级更新
- IUNI U3的手机系统是什么?IUNI U3能升级安卓4.3吗?
- 专业数字录音机价格是多少钱?买哪种品牌?|每日速读
- 驱动到底是什么?我们应该如何安装和更新驱动?
- 破发了!RTX 3060Ti史低价2899元-环球快播报
- 回南天除湿机12L只要479元-全球速看料
- 摄像机的焦距是什么意思?摄像机焦距对应距离介绍_微动态
- 世界要闻:三极管进入截止区与饱和区的条件及制作方法
- 每日看点!CentOS怎么升级Proftpd?CentOS升级Proftpd教程
- 安卓设备的USB周边和安卓USB配件如何调试?具体操作方法
- ClamAV病毒扫描工具怎么安装?ClamAV3.扫描工具安装使用教程
- 每日动态!解析ElasticSearch ElasticSearch字段类型解析
- 世界短讯!【pycharm】1.8.0+cuda111的运行环境
- 索尼新蓝牙耳机曝光!售价120欧 满电续航20小时 环球观点
- 全球新消息丨愚人节整活:卡普空推出猫猫专用《街霸6》对战设备
- PS开始在家电领域与Xbox竞争 PS愚人节视频公开 环球头条
- 《原神》公布3.6版本「盛典与慧业」4月12日上线 看点
- 全球快看:凶不露齿!美国新研究显示霸王龙也有嘴唇
- 性能稳了!曝三星Galaxy S24系列存储将从256GB起步,内存从8GB提升至12GB|当前动态
- HyperX全新推出Cloud2O Hydration耳机 帮助玩家“随时补充水分”
- 极氪 009 迎来首次 OTA 升级,ZEEKR OS 3.6 更新来袭
- 每日快看:《师父》登Steam四天销量破5万份 好评率高达94%
- 【环球热闻】卡普空猫猫专用设备发布!速同猫猫在《街霸6》中PK
- Epic老板蒂姆·斯威尼:我讨厌游戏中的广告|世界热议
- 欲购从速!PlayStation次世代智能家电公布 当前头条
- 吉田修平:很想看到独立开发者对于生成AI技术的应用|天天热闻
- 最新:Xbox高管认为Game Pass业务不会颠覆行业模式
- 环球快看:《辐射4》高清材质包 提升画质的同时保留原版速度
- 《半条命:艾利克斯》无VR MOD最新版本发布-当前速讯
- 地板下面有水怎么处理:新要闻
- WWDC 2023定档:iPhone X惨被抛弃!_天天热文
- iPhone15 Pro颠覆了17年的设计