为什么MySQL数据库超过2000万条数据,查询依然很快:B+树和数据页结构解析

MYSQL数据库单表建议最大2000万条数据,很多人都说如果超过了2000万条数据,性能就会下降的特别厉害。但是你实际上存储后,发现即使超过了2000万但是查询依旧很快,这是为什么?

Mysql为了查询速度,内部使用了B+树,但是为什么。假设我们有这么一张数据表,其中ID是唯一主键,表内有很多行数据。

        虽然在数据表里它们看起来是挨在一起的,但实际上在存储时,他们被分成了很多小份的数据页,每份大小16K。放到某个页上面,因为行数据被分成了好多份,并且放到了很多个数据页里。为了唯一标识具体是哪一页,我们需要引入页号的信息,同时为了把这些数据页给关联起来,于是引入了前后指针,用于指向前后的数据页,这些字段都被加到了数据页的页头里。

        数据页是需要读写的,为了保证写数据到一半突发意外,还引入了校验码,这个被加入到了页尾中,对于单页的数据查找,Mysql还形成了页目录,页目录可以实现二分查找再次降低时间复杂度,剩下的空间才是用来放行数据的。这样换算下来我们一页中能用于存储数据的内存大概为15K。

        如果想查一条行数据,我们可以把表空间里的每一页都遍历一遍判断里面的行数据是不是我们要找。行数据小的时候这么操作是没什么问题的,行数据大了,性能就慢了,因为每次查找都有可能要遍历所有的行数据,为了加速搜索,我们可以在每个数据页里选出主键ID最小的行数据,而且只需要他们的组件ID以及所在页的页号,将他们组成新的行数据,放入到一个新生成的数据页中,各个新的数据页跟之前的页结构没什么太大的区别,而且大小还是16K,同时为了跟之前的数据页进行区分,新的数据页里需要加入页层级的信息,于是数据页之间就有了上下层级的概念,它其实就是我们常说的B+树。

        我们回去看数据页的结构,大概15K用来存放索引数据,每条索引数据主要有主键和指向页号构成。主键+页号大概12个字节左右,用15K÷12个字节等于1280。

再看叶子节点,叶子节点和非叶子节点的数据结构是一样的,所以也假设掐头去尾剩下15K可以发挥,而叶子节点里放的是真正的行数据。假设一条行数据占1K,那一个数据页里能放15行。

假设B加数是三层,那么计算关系1280的2次方*15,那么数据表的总行数就是二点五千万,这个二点五千万就是单表建议最大行数2000万的由来。单层数据页对应最多3次磁盘IO,时间也在可接受范围内。

但是行数超过一个亿就慢了吗?上面假设单行数据用了1K,所以一个数据页里能放15行数据,如果我单行数据用不了那么多,比如只用了250个字节,那么单个数据页就能放60行数据,那同样是三层B+数,单表支持的行数就能到一个亿。在这里也是三层B+树,在这个B加数里要查找到某行数最多也就是3次磁盘IO,所以并不慢。

在最后看到一位大佬说的

mysql性能下降最根本的原因是内存hold不住高频数据了;树高带来的性能影响忽略不计。
因为mysql的非叶子节点基本都是在内存里面的,叶子节点才会经常被淘汰,如果业务整体高频数据太多了,此时mysql为了腾出内存会频繁触发刷脏,从而影响其它查询走的是磁盘io,这时候效率就很慢了,从这里也可以知道讨论mysql性能要从整体去看,而不是动不动就拿单表数据量说事,阿里巴巴规范固然很好但也不能无脑,分库分表能不用就不用,因为用好的人不多,切记,架构简单是设计原则。

推荐一位优秀的up主:小白debug的个人空间-小白debug个人主页-哔哩哔哩视频 (bilibili.com)

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

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

相关文章

私域流量变现干货:轻松盘活,高效增长!

你知道如何增长私域流量并将这些流量转化为实际收益,让我们的品牌价值最大化吗? 今天,就分享几点干货,帮助大家盘活私域流量,实现高效增长! 1、精准定位和用户画像 首先,了解您的私域流量源于…

JavaWeb开发03-Mybatis入门-基础操作-XML映射文件-动态SQL

一、Mybatis-入门 Java程序控制数据库 1.入门 定义实体类:一定要和表中的字段一一对应 配置连接数据库数据 建立Mapper层语句,来获取数据库数据以及将其封装到user的list中去。 2.配置SQL提示 为了进行查询数据库中有哪些表,所以得连接数据…

详解IP证书申请

申请IP证书,也被称为IP SSL证书,是一种特殊的SSL证书,它不同于传统的域名验证(DV)证书,是通过验证公网IP地址而不是域名来确保安全连接。这种证书用于保护IP地址,并在安装后起到加密作用。以下是…

VTK —— 一、Windows10下编译VTK源码,并用Vs2017代码测试(附编译流程、附编译好的库、vtk测试源码)

效果 编译 1、下载VTK8.2.0源码        2、解压源码后,进入目录创建build目录,同时在build内创建install目录 (下图install目录是在cmake第一次后才手动创建,建议在创建build时创建)        3、打开CMake,如下图填入…

CSS 这就是一个按照我看到的css ,边用边总结的笔记~

margin 和 paddingdisplay外部表现类(display-outside) : block , inline内部表现类(display-inside) : flex,gird,table,flow,flow-root,ruby margin 和 padding 可以设置1~4个属性 属性个数属性值1一起设置 上下左右2分别设置 上下 , 左右3分别设置 上 , 左右 , 下4分别设置…

戏作打油诗《无知》

笔者经营多年的《麻辣崇州论坛》,半月前突被攻击我在“霸屏”,没处讲理,特戏作打油诗《无知》一首,为那个无理取闹、砸我“麻辣崇州论坛”的无知小儿画像如下。 请点击链接,一目了然:崇州论坛-麻辣社区 没…

Gemini国内怎么使用

GPT、Claude、Gemini全系列模型国内使用方法来了! 一直以来很多人问我能不能有个稳定,不折腾的全球AI大模型测试网站,既能够保证真实靠谱,又能够保证稳定、快速,不要老动不动就挂了、出错或者漫长的响应。 到目前为止…

Android T多屏多显——应用双屏间拖拽移动功能(更新中)

功能以及显示效果简介 需求:在双屏显示中,把启动的应用从其中一个屏幕中移动到另一个屏幕中。 操作:通过双指按压应用使其移动,如果移动的距离过小,我们就不移动到另一屏幕,否则移动到另一屏。 功能分析…

基于Python的微博舆论分析,微博评论情感分析可视化系统

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

ARM/X86+FPGA轨道交通/工程车辆行业的解决方案

深圳推出首条无人驾驶地铁—深圳地铁20号线,可以说是深圳地铁的一次开创性的突破。智能交通不断突破的背后,需要很严格的硬件软件等控制系 统;地铁无人驾驶意味着信号系统、通信系统、综合监控系统、站台屏蔽门工程等项目必须严格执行验收。…

上位机图像处理和嵌入式模块部署(用树莓派4b开发固件)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 嵌入式开发的领域其实很广,有上位机、驱动和bsp移植。较早之前,由于自己曾经在芯片公司上班,所以对uboot、linu…

ARM汇编指令、指令中s后缀的作用、N、Z、C、V位有什么作用、ARM汇编启动代码

ARM汇编指令 学习arm汇编的主要目的是为了编写arm启动代码,启动代码启动以后,引导程序到c语言环境下允许。换句话说启动代码的目的是为了在处理器复位以后搭建c语言最基本的需求。因此启动代码的主要任务有: 初始化异常向量表; 初始化各工作模式的栈指针寄存器; 开启arm…

如何通过Linux pciehp sysfs接口控制PCIe Slot电源状态?-2

NVME SSD电源状态判断 通过pciehp sysfs接口对NVMe SSD所在的PCIe插槽进行Power On/Off操作时,确实会间接影响到NVMe SSD本身的电源状态。因为NVMe SSD是作为PCIe设备连接到特定插槽上的,插槽电源状态的变化通常会直接影响到与其相连的设备。 当对PCIe…

网络篇12 | 链路层 ARP

网络篇12 | 链路层 ARP 01 简介1)工作过程2)ARP缓存2.1 动态ARP表项2.2 静态ARP表项2.3 短静态ARP表项2.4 长静态ARP表项 02 ARP报文格式1)ARP请求报文格式2)ARP响应报文格式3)套一层以太网帧(ARP帧&#x…

史上最全excel导入功能测试用例设计(以项目为例)

web系统关于excel的导入导出功能是很常见的,通常为了提高用户的工作效率,在维护系统中的一些数据的时候,批量导入往往比一个一个添加或者修改快很多。针对导入功能的测试,往往会有很多种情况,现在针对平时项目中遇到的…

灰度部署、滚动部署与蓝绿部署

前言 最近在进行单元化建设方面的的工作,其中涉及服务分组和蓝绿发布相关的概念,在这里总结一下了解到的相关知识。 版本更新策略 功能开关 在应用逻辑里内置功能开关,通过开关的打开关闭来决定执行新旧逻辑,无需路由机制支持…

使用DockerCompose配置基于哨兵模式的redis主从架构集群

文章目录 一、注意事项(坑点!!!)二、配置Redis主从架构集群第一步:创建目录文件结构第二步:编写DockerCompose配置文件第三步:编写redis.conf第四步:启动redis主从集群 三…

如何在树莓派安装Nginx并实现固定公网域名访问本地静态站点

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx(发音为“engine-x”)可以将您的树莓派变成一个强大的 Web 服务器,可以用于托管网站或 Web 应用程序。相比其他 Web 服务器,Ngi…