首页 > 数据库 >MYSQL的B+Tree索引树高度如何计算

MYSQL的B+Tree索引树高度如何计算

时间:2024-01-15 10:13:05浏览次数:40  
标签:25 存储 Tree 高度 索引 KEY MYSQL 节点

前一段被问到一个平时没有关注到有关于MYSQL索引相关的问题点,被问到一个表有3000万记录,假如有一列占8位字节的字段,根据这一列建索引的话索引树的高度是多少?

这一问当时就被问蒙了,平时这也只关注MySQL索引一般都是都是用B+Tree来存储维护索引的,还有一些复合索引的最左匹配原则等等,还真没有实际关注过始即然用到索引能提升

查询的效率,那么这个索引树高是多少,给定表和索引字段后怎么计算出索引树的高度?下面将用举例的形式来说明如何计算索引树的高度。

在举例之前,先给出一个千万级记录表的索引的高度大概在3-5的样,当时我看到这个数字时也是很惊讶的!

举例前先做一下举例时用到的公式的一些维度的说明

假设:

 表的记录数是N

 每一个BTREE节点平均有B个索引KEY

那么B+TREE索引树的高度就是logNB(等价于logN/logB)

由于索引树每个节点的大小固定,所以索引KEY越小,B值就越大,那么每个BTREE节点上可以保存更多的索引KEY,也就是B值越大,索引树的高度就越小,那么基于索引的查询的性能就越高。所以相同表记录数的情况下,索引KEY越小,索引树的高度就越小。

现在我们假设表3000W条记录(因为2^25=33554432),如果每个节点保存64个索引KEY,那么索引的高度就是(log2^25)/log64≈ 25/6 ≈ 4.17

通过上面的计算可知,要计一张表索引树的高度,只需要知道一个节点有多,从而就能知道每个节点能存储多少个索引KEY。现代数据库经过不断的探索和优化,并结合磁盘的预读特点,每个索引节点一般都是操作系统页的整数倍,操作系统页可通过命令得到该值得大小,且一般是4094,即4k。而InnoDB的pageSize可以通过命令得到,默认值是16k。

以BIGINT为例,存储大小为8个字节。INT存储大小为4个字节(32位)。索引树上每个节点除了存储KEY,还需要存储指针。所以每个节点保存的KEY的数量为pagesize/(keysize+pointsize)(如果是B-TREE索引结构,则是pagesize/(keysize+datasize+pointsize))。

假设平均指针大小是4个字节,那么索引树的每个节点可以存储16k/((8+4)*8)≈171。那么:一个拥有3000w数据,且主键是BIGINT类型的表的主键索引树的高度就是(log2^25)/log171 ≈ 25/7.4 ≈ 3.38。

假设平均指针大小是8个字节,那么索引树的每个节点可以存储16k/((8+8)*8)≈128。那么:一个拥有3000w数据,且主键是BIGINT类型的表的主键索引树的高度就是(log2^25)/log128 ≈ 25/7 ≈ 3.57

由上面的计算可知:一个千万量级,且存储引擎是MyISAM或者InnoDB的表,其索引树的高度在3~5之间

对照表:

层高 最大数据量
1 128
2 131072
3 2097152
4 268435456
5 约300亿

 

 

 

 

 

 

来源:https://www.cnblogs.com/songpingyi/p/10730156.html

标签:25,存储,Tree,高度,索引,KEY,MYSQL,节点
From: https://www.cnblogs.com/databank/p/17964767

相关文章

  • Centos7 yum方式安装 mysql 5.6
    Centos7安装mysql5.6[root@server1~]#cat/etc/redhat-releaseCentOSLinuxrelease7.4.1708(Core)[root@server1~]#uname-r3.10.0-693.el7.x86_64一、安装MySQL前准备1)查看系统是否存在旧版本rpm-qa|grepmysql可能出现一到多个结果,也可能没有2)卸载旧版......
  • docker mysql8 忘记root密码解决方法
    使用docker搭建mysql,docker-compose.ymlversion:"2.1"services:mysql:image:mysql:8.0.35container_name:mysql8healthcheck:test:["CMD","mysqladmin","ping","-h","localhost&q......
  • 记一次 MySQL timestamp 精度问题的排查 → 过程有点曲折
    开心一刻下午正准备出门,跟正刷着手机的老妈打个招呼我:妈,今晚我跟朋友在外面吃,就不在家吃了老妈拿着手机跟我说道:你看这叫朋友骗缅北去了,tm血都抽干了,多危险我:那是他不行,你看要是吴京去了指定能跑回来老妈:还吴京八经的,特么牛魔王去了都得耕地,唐三藏去了都......
  • Ubuntu22.04安装Mysql
    1、下载mysql1.1使用仓库安装工具下载wgethttps://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb安装使用sudodpkg-i./mysql-apt-config_0.8.29-1_all.deb1.2安装mysql更新仓库sudoaptupgradesudoaptupdate安装mysqlsudoapt-getinstall......
  • Slint 文件编辑不能在 Rust 中及时索引
    这个现象在编写VSCode中编写SlintDSL代码时非常常见.表现为修改Slint代码,如:导出新的component/global;为component增加/修改方法,属性,回调;在global中修改结构体属性,修改回调;随后前往Rust的nativecode中试图调用这些方法时,Rust的代码提示无......
  • 【Vue】前端直接显示MySQL Datatime时间,显示为英文如何处理
    问题如图想让时间显示为自己想要的格式,可以自己编写一个函数constformatDate=(timestamp)=>{constdate=newDate(timestamp);constyear=date.getFullYear();constmonth=String(date.getMonth()+1).padStart(2,'0');constday=String(date.getDate......
  • MySQL常用命令
    操作数据库--链接数据库mysql-uroot-p--退出数据库quit/exit--显示数据库版本selectversion();--查看当前使用的数据库selectdatabase();--查看所有数据库showdatabases;--创建数据库createdatabasekunamecharset=utf8;--查看创建数据库的语句show......
  • 学习MySQL总结
    每一行称为记录每一列称为字段 SQLSQL语句的作用是实现数据库D客户端和服务端之间的通信.其表现口形式为:D带有一定格式的字符串.1970年E.F.Codd的《ARelationalModelofDataforLargeSharedDataBanks》的论文开始讲起。该论文奠定了关系模型的理论基础,Codd的同事DonCham......
  • POJ1635subway tree system
    在扫描过程中一旦扫描到一个子串01数量相等了,这个时候肯定是已经递归回到根节点了,因为从根节点下去的一步操作给了一个0,而这个0一定要从这条边回到根节点才能产生一个1与其匹配(这个1不可能来自其他边的回溯,因为其他边的回溯的前提就是之前从这条边下去了,就会产生一个0,,这个0就要......
  • MySql索引详情分析
    索引是帮助MySql高效获取数据的排好序的数据结构。(B+tree)为何是B+Tree这个数据结构呢?二叉树:对于单边增值的数据会造成数据倾斜,最终导致数据查询效率不高。红黑树:对于数据量大的时候树的高度会很高,也会导致查找次数变高。B-Tree叶节点具有相同的深度,叶节点的指......