B树:动机
看完你能算出磁盘I/O代价并讲清B树的设计动机
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
B树:动机
看完你能算出磁盘I/O代价并讲清B树的设计动机
640KB的启示
B-树诞生的 1972 年,内存以 KB 计。IBM PC 上市后那句「640KB 够用」被反复引用——但这究竟是硬件约束,还是设计哲学?先看地址线。
地基决定房子能盖多大,不住的人说'够住'——640KB 是物理事实,不是设计哲学
越来越大的数据 vs 越来越小的内存
真正的瓶颈不是数据存在哪里,而是内存还能不能装下;混淆规模增长与容量增长,就会误判查询代价。
- 数据量从KB膨胀到TB
- 数据文件与索引持续累积
- 完整数据常驻内存越来越难
- 内存容量增长远慢于数据
- 一次可装入的数据持续变少
- 查询越来越依赖分层存储
从640KB到TB:数量级的跨越
三条平行轴:时间、内存容量、数据规模,自上而下看剪刀差
分级I/O
数据已是TB级、内存只有GB级——这意味着每次要找的东西大概率不在内存里。访问磁盘一次要多久?先看清三级存储的代价差距。
灶台随手拿(缓存),冰箱走两步(内存),超市跑一趟(磁盘)
内存相对越来越小
上一页从 640KB 跨到 TB,看到数据规模膨胀了几个数量级。但更要命的是:内存也在长,只是长得远没有数据快。差距在拉大。
书桌偶尔换大点,仓库却年年扩建,桌上能摆的永远是仓库的零头
一秒与一天
CPU 和磁盘 I/O 的差距,横跨 5 个数量级——这不是量变,是质变。
- 实际耗时:约 1 纳秒
- 按比例放大:≈ 1 秒
- 感受:一眨眼的事
- 实际耗时:约 10 毫秒
- 按比例放大:≈ 1 天
- 感受:等到天荒地老
1 Byte = 1 KB:块读写的代价
上页说到,磁盘一次读写比内存慢百万倍。那一次读写到底读了多少数据?是 1 字节还是更多?这个答案,决定了后面所有算法设计的取舍。
快递员跑一趟就是「一车」成本,取一件还是装满都要跑这一趟
二叉搜索树的磁盘困境
前面讲过磁盘按块读写——读一个节点和读一整块开销相同。把这代价放到 BST 的每一层上,log₂n 的树高就意味着 n 越大,每次查找要走的趟数越多。
书架(盘)容量大,但一格(块)只放一书(一节点),找一本要下 log n 层
B树的核心设计思想
二叉树每个节点只放一个键,比较一次就要一次I/O。但磁盘一次能读一整块——如果把多个键塞进一个节点呢?这就是B树的核心思路:让一个磁盘块做更多的事。
一页几百词对应一节点几十键,二分到中间再决定翻前后
核心理解检验
B树通过增大单个节点容量来减少磁盘I/O次数,根本原因是?
课后思考
先自己想,再看参考答案。三个问题分别对应回顾、应用、迁移。
参考答案想分支因子B与树高的关系:B越大树高越低但块内二分查找变慢,存在一个由硬件决定的甜点。
参考答案成立。延迟下降≠带宽变高,块对齐思想依然有效;只是 B 的最优值变大了,甜点会移动。
参考答案没变。无论数量级怎么涨,"让一次I/O带回尽量多的有用信息"始终是核心,变的只是参数。