B+树简介

在正式介绍本文的主题前,需要对 B+ 树有一定的了解,B+树是一种磁盘上数据的索引结构,大概长这个样子。

B+树的叶子节点是所有的数据,非叶子节点称为索引页,索引页里有若干个索引项,本例中有 3 个索引项,也就是索引页的出度为 3,表示它有 3 个子节点。

相要寻找某一个数据时,比如值为 6 的数据,只需要先在索引页中找到小于 6 的最大的索引项 4,就可以索引到保存了 4,5,6 三条数据的数据页,进而找到值为 6 的这一条数据。

当然,B+ 树不是只有一个索引节点,只是为了方便展示所以图中只有一个索引节点,一个更大的 B+ 树如下图所示。

数学推导

假设 B+ 树总共索引了 N 条数据(叶子节点的数据量),每个索引页的出度为 EntriesPerPage(索引页内有多少个索引项),则 B+ 树的高度可以由如下式子计算:

\[IndexHeight \approx \frac{log_{2}{N}}{log_{2}{EntriesPerPage}}
\]

定义 IndexPageUtility 为衡量索引页到数据页的远近的指标,可以由如下式子计算:

\[IndexPageUtility = log_{2}{EntriesPerPage}
\]

这里可以不必纠结为什么 utility 就是这么算的,只要理解 utility 和 EntriesPerPage 是正相关的关系就可以,因为最后算的收益成本比率只是一个比值,能比较出大小就可以,所以这里就取 utility 为 IndexHeight 计算公式的分母。

举个例子,如果索引项大小为 20 字节,那么 2KB 的索引页应该是能装下 100 个索引项,但实际上索引页内不仅仅只存有索引项,实际索引项最高能占用 70% 的空间,也就是 70 个索引项。这样的索引页的 utility 为 \(log_{2}{70}\) 约为 6.2,大约是 128KB 大小索引页 utility 的一半。

每一次读索引页都需要读一次磁盘,相应的距离目标数据也更进一步(使用 utility 衡量步长)。基于这种成本效益的权衡,产生了一个最佳的页面大小,平衡了读一次索引页的收益(IndexPageUtility)和成本(IndexPageAccessCost)。

对于越大的索引页,它的出度越大,utility 越高,从磁盘读取的成本也越高,对于特定的磁盘的寻址时间和传输速率,有一个最优的索引页大小。

假设磁盘平均寻址时间为 10 毫秒,传输速率为 10MB 每秒,索引页大小为 2KB,那么读取索引页需要的时间为 10.2 毫秒。

更准确的说,读取索引页的成本要么是有页面缓存时的内存存储成本,要么是从磁盘读取页面的磁盘访问成本。如果根索引页及附近的索引页缓存在内存中,能够节省一个数量恒定的 IO 次数,这个数量一般是可以忽略的。

因此从磁盘读取索引页的成本可以由如下式子计算,DiskLatency 为磁盘寻址时间。

\[IndexPageAccessCost = DiskLatency + \frac{PageSize}{DiskTransferRate}
\]

那么读取索引页的收益和成本的比率就是:

\[BenefitCostRatio = \frac{IndexPageUtility}{IndexPageAccessCost}
\]

应用分析

假设磁盘平均寻址时间为 10 毫秒,传输速率为 10MB 每秒,索引项大小为 20 字节,下表给出不同索引页大小对应的收益成本比率。

IndexPageSize(KB) EntriesPerPage IndexPageUtility IndexPageAccessCost BenefitCostRatio
2 68 6.1 10.2 0.60
4 135 7.1 10.4 0.68
8 270 8.1 10.8 0.75
16 541 9.1 11.6 0.78
32 1081 10.1 13.2 0.76
64 2163 11.1 16.4 0.68
128 4325 12.1 22.8 0.53

通过上表可以得出,索引页大小在 8KB 到 32KB 是收益成本比率是最优的。索引页过小或过大都不是好的选择。且该索引页大小范围也随着磁盘传输速率的提升而发生变化,当传输速率为 40MB 每秒,最优的索引页大小将变成 32KB 到 128 KB。

B+树索引页大小是如何确定的?的更多相关文章

  1. MySQL:InnoDB存储引擎的B+树索引算法

    很早之前,就从学校的图书馆借了MySQL技术内幕,InnoDB存储引擎这本书,但一直草草阅读,做的笔记也有些凌乱,趁着现在大四了,课程稍微少了一点,整理一下笔记,按照专题写一些,加深一下印象,不枉读了 ...

  2. MySQL的B树索引与索引优化

    MySQL的MyISAM.InnoDB引擎默认均使用B+树索引(查询时都显示为"BTREE"),本文讨论两个问题: 为什么MySQL等主流数据库选择B+树的索引结构? 如何基于索引 ...

  3. 搞懂MySQL InnoDB B+树索引

    一.InnoDB索引 InnoDB支持以下几种索引: B+树索引 全文索引 哈希索引 本文将着重介绍B+树索引.其他两个全文索引和哈希索引只是做简单介绍一笔带过. 哈希索引是自适应的,也就是说这个不能 ...

  4. MySQL之B+树索引(转自掘金小册 MySQL是怎样运行的,版权归作者所有!)

    每个索引都对应一棵B+树,B+树分为好多层,最下边一层是叶子节点,其余的是内节点.所有用户记录都存储在B+树的叶子节点,所有目录项记录都存储在内节点. InnoDB存储引擎会自动为主键(如果没有它会自 ...

  5. [MySQL] 索引中的b树索引

    1.索引如果没有特别指明类型,一般是说b树索引,b树索引使用b树数据结构存储数据,实际上很多存储引擎使用的是b+树,每一个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点的范围遍历 2.底层的 ...

  6. InnoDB存储引擎的 B+ 树索引

    B+ 树是为磁盘设计的 m 叉平衡查找树,在B+树中,所有的记录都是按照键值的大小,顺序存放在同一层的叶子节点上,各叶子节点组成双链表.叶节点是数据,非叶节点是索引. 首先,需要清楚:B+ 树索引并不 ...

  7. InnoDB存储引擎的B+树索引算法

    关于B+树数据结构 ①InnoDB存储引擎支持两种常见的索引. 一种是B+树,一种是哈希. B+树中的B代表的意思不是二叉(binary),而是平衡(balance),因为B+树最早是从平衡二叉树演化 ...

  8. MySQL中B+树索引的使用

    1)         不同应用中B+树索引的使用 对于OLTP应用,由于数据量获取可能是其中一小部分,建立B+树索引是有异议时的 对OLAP应用,情况比较复杂,因为索引的添加应该是宏观的而不是微观的. ...

  9. B树索引与索引优化

    B树索引与索引优化 MySQL的MyISAM.InnoDB引擎默认均使用B+树索引(查询时都显示为“BTREE”),本文讨论两个问题: 为什么MySQL等主流数据库选择B+树的索引结构? 如何基于索引 ...

随机推荐

  1. 1903021121-刘明伟-java十一周作业-java面向对象编程

    项目 内容 课程班级博客链接 19级信计班(本) 作业要求链接 第十一周作业 博客名称 1903021121-刘明伟-java十一周作业-java面向对象 要求 每道题要有题目,代码(使用插入代码,不 ...

  2. Linux磁盘空间查看及空间满的处理

    问题 在部署应用到测试环境的时候,有些文件同步出错,最后定位到测试服务器空间满了. 解决 查看磁盘空间还剩多少空间 df -h 查看根目录下每个目录占用空间大小 du --max-depth=1 -h ...

  3. Kitex源码阅读——脚手架代码是如何通过命令行生成的(一)

    前言 Kitex是字节跳动内部的Golang微服务RPC框架,先已开源. Kitex文档:https://www.cloudwego.io/zh/docs/kitex/getting-started/ ...

  4. 封装axios请求

    import axios from 'axios' import router from '@/router' axios.defaults.baseURL = system.requestBaseU ...

  5. Unity实现”对象池管理器“

    前言:警告!这可能是坨屎,空闲时间写成,仅作娱乐 在Unity中生成或销毁一个物体会占用较大的资源,如果是制作FPS射击游戏,子弹生成更是雪上加霜.所以我自己写了一个PoolManager,不能和网上 ...

  6. 解决WIN7无法安装高版本Node.js问题

    网上很多文章都让去安装低版本node 由于业务需求,低版本node npm 有一些包支持的不好 npm出cb() never call 本着更新npm 顺带弄个高版本的node 单独更新npm npm ...

  7. torch.ones_like(),expand_as(),expend()等torch.repeat

    https://blog.csdn.net/Arthur_Holmes/article/details/104267662 https://blog.csdn.net/weixin_39568781/ ...

  8. hive完整搭建

    安装 MySQL 服务的详细步骤如下: 1. 解压安装包 现在已经为大家下载好了 MySQL 5.7.25 的安装包,存放在 /root/software 目录下.首先进入此目录下,然后使用tar - ...

  9. LayUI+SSM实现一个简单的后台管理系统

    该后台管理系统是用于管理视频网站数据的,目前分5个菜单项,这篇博客主要讲述[影片管理]的具体功能和实现 后台代码结构和[影片管理]的界面如下图 该界面分为上下2部分,[搜索条件]和[影片列表],2部分 ...

  10. 分享自己平时使用的socket多客户端通信的代码技术点和软件使用

    前言 说到linux下多进程通信,有好几种,之前也在喵哥的公众号回复过,这里再拿出来,重新写一遍:多进程通信有管道,而管道分为匿名和命名管道 ,后者比前者优势在于可以进行无亲缘进程通信:此外信号也是进 ...