B树(B-tree)适配磁盘存储的核心原因是什么?
嘿,你猜的方向完全没错!咱们用大白话把这事说清楚——先得搞懂磁盘的“臭脾气”,再看B树是怎么精准“讨好”它的。
先唠唠磁盘的核心特点:寻址慢到离谱,连续读快得飞起
你可以把磁盘想象成一个老式黑胶唱片:要找某首歌,得先让唱针挪到对应的轨道(这就是寻址),这个过程要等好几毫秒;但一旦唱针到位,顺着轨道连续听歌(连续读数据)就快多了,一秒能读好几兆。
内存就不一样了,内存是“随叫随到”,找任何数据都几乎没延迟。但磁盘不行——寻址的时间比连续读几十KB数据的时间还长,这是它的天生短板。
B树是怎么适配磁盘的?
1. 长得“矮胖”,把寻址次数压到最少
普通二叉搜索树是“瘦高”的,比如存1亿条数据,可能要20多层,每查一个数据就得从根节点往下走20次,每次都要让磁盘寻址一次——这就像你找一本书,要爬20层楼,每层都要找一次书架,累死人。
但B树是“多叉树”,一个节点能存成百上千个键(比如一个节点存1000个键),那存1亿条数据最多只要3层!查数据最多寻址3次——相当于爬3层楼就找到书了,省了超多时间。
2. 节点大小刚好贴合磁盘的“读取单位”
磁盘读数据不是按字节读的,是按磁盘块读的(比如一个块是4KB),哪怕你只需要块里的一个字节,磁盘也得把整个块读出来。
B树的节点就设计成刚好等于一个磁盘块的大小——这样读一个B树节点,就是读一整块磁盘数据,完全不浪费磁盘的读取能力。要是用二叉树,一个节点可能就几个字节,读它也要读一整块,剩下的空间全浪费了,太亏。
3. 天生自带“局部性”,完美利用连续读
B树的每个节点里的键都是排好序的,而且子节点的指针也是按顺序存的。磁盘读连续数据快,所以读一个节点里的所有键和指针时,是连续读取,速度拉满;而且查询的时候,在节点里找目标键也是顺序遍历,不用跳来跳去,刚好契合磁盘的优势。
举个对比的例子
比如你要找一个数据,用二叉搜索树可能要寻址20次,每次只读几个字节,大部分时间都耗在“挪唱针”上;用B树最多寻址3次,每次读一整块有用的数据,效率差了好几个量级。
说白了,B树就是把磁盘“寻址慢、连续读快”的特点摸得门儿清,每一处设计都在帮磁盘省力气,所以它才成了磁盘存储的首选结构。
内容的提问来源于stack exchange,提问作者user7826451

