总结/朱季谦

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+树可以存储两千万左右条数据的计算逻辑的更多相关文章

  1. mysql在innodb索引下b+树的高度问题。

    B+树索引介绍 B+树索引的本质是B+树在数据库中的实现.但是B+树索引有一个特点是高扇出性,因此在数据库中,B+树的高度一般在2到3层.也就是说查找某一键值的记录,最多只需要2到3次IO开销.按磁盘 ...

  2. 【Mysql】InnoDB 中的 B+ 树索引

    接上一篇内容,InnoDB 的作者想到一种更灵活的方式来管理所有目录项,是什么? 一.目录项记录页 其实这些用户目录项与用户记录很像,只是目录项中的两个列记录的是主键和页号而已,那么就可以复用之前存储 ...

  3. B+树叶子节点数据如何存储,以及如何查找某一条数据

    MySQL索引背后的数据结构及算法原理 https://www.kancloud.cn/kancloud/theory-of-mysql-index  非常好 根据一条sql  如何查看索引结构等信息 ...

  4. mysql单列去重复group by分组取每组前几条记录加order by排序

    mysql分组取每组前几条记录(排名) 附group by与order by的研究,需要的朋友可以参考下 --按某一字段分组取最大(小)值所在行的数据 复制代码代码如下: /* 数据如下: name ...

  5. 浅析b-树 b+树 以及Mysql的Innodb,Myisam引擎

    B-树性质 B-树可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点. 1根节点至少有两个子节点 2每个节点有M-1个key,并且以升序排列 3位于M-1和M key的子节点的值位于 ...

  6. 一分钟掌握MySQL的InnoDB引擎B+树索引

    MySQL的InnoDB索引结构采用B+树,B+树什么概念呢,二叉树大家都知道,我们都清楚随着叶子结点的不断增加,二叉树的高度不断增加,查找某一个节点耗时就会增加,性能就会不断降低,B+树就是解决这个 ...

  7. 面试官:为什么Mysql中Innodb的索引结构采取B+树?

    前言 如果面试官问的是,为什么Mysql中Innodb的索引结构采取B+树?这个问题时,给自己留一条后路,不要把B树喷的一文不值.因为网上有些答案是说,B树不适合做文件存储系统的索引结构.如果按照那种 ...

  8. 重新学习MySQL数据库2:『浅入浅出』MySQL 和 InnoDB

    重新学习Mysql数据库2:『浅入浅出』MySQL 和 InnoDB 作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.P ...

  9. 『浅入浅出』MySQL 和 InnoDB

    作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系 ...

随机推荐

  1. day03_1_idea教程

    # idea使用教程 # 一.idea相关概念介绍 ## 1.1 IDE概念介绍 集成开发环境(IDE,Integrated Development Environment)是用于提供程序开发环境的应 ...

  2. day03_2_流程控制

    # 流程控制 学习目标: ~~~txt1. idea安装与使用2. 流程控制if...else结构3. 流程控制switch结构4. 流程控制循环结构5. 流程控制关键字~~~ # 一.流程控制概述 ...

  3. 日志审计与分析实验三(rsyslog服务器端和客户端配置)(Linux日志收集)

    Linux日志收集 一.实验目的: 1.掌握rsyslog配置方法 2.配置rsyslog服务收集其他Linux服务器日志: C/S架构:客户端将其日志上传到服务器端,通过对服务器端日志的查询,来实现 ...

  4. 清北学堂 2020 国庆J2考前综合强化 Day6

    目录 1. 题目 T1 双色球计数 题目描述 Sol 炼金术 题目描述 Sol T3 地铁大亨 题目描述 Sol T4 结束的派对 题目描述 Sol 算法 - 分治 1. 分治 2. 二分 3. 倍增 ...

  5. 干货分享:小技巧大用处之Bean管理类工厂多种实现方式

    前言:最近几个月很忙,都没有时间写文章了,今天周末刚好忙完下班相对早点(20:00下班)就在家把之前想总结的知识点写出来,于是就有了这篇文章.虽无很高深的技术,但小技巧有大用处. 有时我们经常需要将实 ...

  6. 后端统一处理返回前端日期LocalDateTime格式化去T,Long返回前端损失精度问题

    一.前言 我们在实际开发中肯定会遇到后端的时间传到前端是这个样子的:2022-08-02T15:43:50 这个时候前后端就开始踢皮球了,!! 后端说:前端来做就可! 前端说:后端来做就可! 作为一名 ...

  7. 选择结构——if控制语句单、双、多分支结构

    1.if控制语句 概念: if控制语句共有3种不同形式,分别是单分支结构.双分支结构和多分支结构. (1)使用 if 语句实现单分支处理 语法格式: if(表达式){ 语句 } 流程图: 执行步骤: ...

  8. 飞书前端提到的竞态问题,在 Android 上怎么解决?

    请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...

  9. Java SE 8 新增特性

    Java SE 8 新增特性 作者:Grey 原文地址: Java SE 8 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_ ...

  10. Linux 09 Vim

    参考源 https://www.bilibili.com/video/BV187411y7hF?spm_id_from=333.999.0.0 版本 本文章基于 CentOS 7.6 概述 Vi Vi ...