MySql的InnoDB的三层B+树可以存储两千万左右条数据的计算逻辑
总结/朱季谦
B+树是一种在非叶子节点存放排序好的索引而在叶子节点存放数据的数据结构,值得注意的是,在叶子节点中,存储的并非只是一行表数据,而是以页为单位存储,一个页可以包含多行表记录。非叶子节点存放的是索引键值和页指针。
那么,在MySql数据库里,一个页的大小是多少呢?
可以通过查询语句进行查看:show variables like 'innodb_page_size'
查询结果16384字节,可以通过1kb等于1024字节方式,计算出16384/1024 = 16kb,说明MySql数据库默认页大小是16kb。
假设一行数据占用1kb的空间大小,然而实际上,除去字段很多的宽表外,其实很多简单的表行记录都远达不到1kb空间占比。这里我们用最坏的情况来假设一行记录大小为1kb,那么,一个16kb的页就可以存储16行数据。
接下来,我们先画一个只要两层高的B+树结构图。
假设第一层根节点存在以下情况:索引1对应页指针地址10,索引5对应页指针地址30,索引8对应页指针地址50。
第二层节点作为叶子节点,存放的是大小为16kb的页数据,页数据里每一行记录大小为1kb,那么,一个叶子节点的页里就可以存放16条数据。
既然已经知道一个叶子节点的页中可以存放16条数据,那么,只需要知道根节点存在多少页地址指针即可,就能通过 “根节点页地址指针数量 * 单个叶子节点记录行数”。
那么,根节点能存放多少个 索引:页地址指针的数据呢?
在一个节点大小为16kb的情况下,我们只需要知道索引键值和页地址指针两者大小总和即可。
根据一些资料得知,在MySql数据库当中,指针地址大小为6字节,若索引是bigint类型,那么就为8字节,两者加起来总共是14字节。
接下来,通过以下计算步骤,就可以统计出两层的B+数大概可以存储多少条记录数据——
一、先计算一个节点的字节大小:16kb * 1024 = 16384 字节。
二、16384 字节 / 14 字节 = 1170 ,意味着,根节点有1170个页地址指针,然后,每个页地址指针指向的叶子节点可以存放16条数据。
三、那么,根据“根节点页地址指针数量 * 单个叶子节点记录行数”,计算1170 * 16 = 18720 条记录,可见,两层B+数可以存放18720条记录,当然,这个数字是存在出入的,只是作为参考。
既然已经知道两层B+数可以存放18720条数据,那么,三层不就可以进一步算出了吗?
简单画一个三层B+数的存放数据计算逻辑——
一、根节点最多有1170个指针数;
二、说明第二层最多会有1170个子节点,同时,每个子节点里最多有1170个指针数;
三、那么,第三层叶节点数量,可以通过 “第二层最多有1170个节点数量 * 每个节点里最多有1170个指针数量”,也就是1170 * 1170
四、最后,计算第三层所有叶子数量 * 各个叶子节点存放的16条数据;
最后,1170 * 1170 * 16 = 21902400,得出两千万左右条数据。
综上所述,若面试当中遇到这样问题,可以按照这个流程计算回答。
MySql的InnoDB的三层B+树可以存储两千万左右条数据的计算逻辑的更多相关文章
- mysql在innodb索引下b+树的高度问题。
B+树索引介绍 B+树索引的本质是B+树在数据库中的实现.但是B+树索引有一个特点是高扇出性,因此在数据库中,B+树的高度一般在2到3层.也就是说查找某一键值的记录,最多只需要2到3次IO开销.按磁盘 ...
- 【Mysql】InnoDB 中的 B+ 树索引
接上一篇内容,InnoDB 的作者想到一种更灵活的方式来管理所有目录项,是什么? 一.目录项记录页 其实这些用户目录项与用户记录很像,只是目录项中的两个列记录的是主键和页号而已,那么就可以复用之前存储 ...
- B+树叶子节点数据如何存储,以及如何查找某一条数据
MySQL索引背后的数据结构及算法原理 https://www.kancloud.cn/kancloud/theory-of-mysql-index 非常好 根据一条sql 如何查看索引结构等信息 ...
- mysql单列去重复group by分组取每组前几条记录加order by排序
mysql分组取每组前几条记录(排名) 附group by与order by的研究,需要的朋友可以参考下 --按某一字段分组取最大(小)值所在行的数据 复制代码代码如下: /* 数据如下: name ...
- 浅析b-树 b+树 以及Mysql的Innodb,Myisam引擎
B-树性质 B-树可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点. 1根节点至少有两个子节点 2每个节点有M-1个key,并且以升序排列 3位于M-1和M key的子节点的值位于 ...
- 一分钟掌握MySQL的InnoDB引擎B+树索引
MySQL的InnoDB索引结构采用B+树,B+树什么概念呢,二叉树大家都知道,我们都清楚随着叶子结点的不断增加,二叉树的高度不断增加,查找某一个节点耗时就会增加,性能就会不断降低,B+树就是解决这个 ...
- 面试官:为什么Mysql中Innodb的索引结构采取B+树?
前言 如果面试官问的是,为什么Mysql中Innodb的索引结构采取B+树?这个问题时,给自己留一条后路,不要把B树喷的一文不值.因为网上有些答案是说,B树不适合做文件存储系统的索引结构.如果按照那种 ...
- 重新学习MySQL数据库2:『浅入浅出』MySQL 和 InnoDB
重新学习Mysql数据库2:『浅入浅出』MySQL 和 InnoDB 作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.P ...
- 『浅入浅出』MySQL 和 InnoDB
作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系 ...
随机推荐
- 无用的IP黑名单
无效的IP黑名单,有些还没有收集,在阿里云或者腾讯云的安全组里面设置,拦截不必要的IP,免得遭到攻击,也避免的CPU和内存过高 来源 备注82.102.21.217 拒绝 随机访问目录攻击,频繁69. ...
- [ERROR] Another process with pid 914 is using unix socket file.
mysql启动报错 1.首先到mysql的配置文件中,确定socket文件路径 vim /etc/my.cnf 2.删除mysql.sock.lock 3.启动mysql
- Linux 任务计划管理
在某个时间点执行一次任务 at工具 作用:用于执行一次性任务,需要指定执行的时间. at工具来源于at软件包. 依赖与atd服务,需要启动才能实现at任务.#通过这个守护进程见监控at的相关内容 #选 ...
- 2022-07-14 第六组 润土 Java02学习笔记
1.引用数据类型 Scanner类: Scanner shuru=new Scanner(System.in); int a=shuru.nextInt();//输入整型 String b= shur ...
- shell查询prometheus数据
#shell查询prometheus数据 shell使用curl调用HTTP API执行PromQL /api/v1/query查询某一时刻的数据 查询条件PromSQL复杂时, 传入接口/api/v ...
- 【水】关于 __attribute__
目录 1. weak 2. aligned 3. __packed__ 4. always_inline 1. weak 实现如果 Func1 被定义了,我就调用 Func1, 否则就调用 MyFun ...
- linux 安装Apache php mysql注意事项
由于apache的php组件 php.so是由php安装生成的,故需在Apache安装之后才安装php比较合适 libphp5.so是php5提供的,你还需要编译php5才能生成这个文件 你在PHP的 ...
- React报错之Property 'X' does not exist on type 'HTMLElement'
正文从这开始~ 总览 在React中,当我们试图访问类型为HTMLElement 的元素上不存在的属性时,就会发生Property 'X' does not exist on type 'HTMLEl ...
- Linux使用netstat查看网络状态
查看本机的网络状态.使用netstat查看网络状态.显示系统端口使用情况.UDP类型的端口.TCP类型的端口.只显示所有监听端口.只显示所有监听tcp端口. 命令使用举例 命令 说明 netstat ...
- 【Harmony OS】【ArkUI】ets开发 简易视频播放器
前言:这一次我们来使用ets的Swiper组件.List组件和Video组件制作一个简易的视频播放器.本篇是以HarmonyOS官网的codelab简易视频播放器(eTS)为基础进行编写.本篇最主要 ...