数据结构演进你能明白为啥要用B+Tree来存储,其中B树已经结合了部分磁盘读取的特性,现在详细讲解,在逻辑上存储数据和在磁盘上存储树的区别,
1. 大量数据的持久化需要持久化到磁盘上
2. 磁盘读取速度慢,尽量减少IO次数
3. 读取磁盘单位是块,所以数据能放在一块就不放在两块
4. 如果按照树节点结构为Node(data,next),挨个读取数据,那么不同节点最坏的情况是在不同块中,如果读取一个块为16k,只使用其中一个Node数据(8B),是不是很浪费。数据量稍微大一点,树就会很深,那么就得进行多少次IO。
Node类型:
A:ID 用来排序的依据
B:数据域 用来其他数据,对于节点是否存储数据专门讨论,这里暂定是存储数据的
C:Left节点引用:左子树root节点引用
D:Right节点引用:右子树root节点引用
5. 如果每次读取必须读取一个磁盘块(操作系统规定,类似Mysql的存储页),那么只有这个磁盘块都是有用的才没有浪费。数据结构上,就用一个磁盘块对于树中的一个Node,这样势必会存储很多组数据。那么节点数据结构如下:
约定术语:
Node,树节点:指的是上面大方块内容
数据,Data,一条数据:指的是上面ID1+数据域
举例说明:假定一个Node只能存储两个数据,三个引用
场景1:查找id=28的用户信息,流程如下: 1. 先找到根节点也就是页1,判断28在键值17和35之间,我们那么我们根据页1中的指针p2找到页3。 2. 将28和页3中的键值相比较,28在26和30之间,我们根据页3中的指针p2找到页8。 3. 将28和页8中的键值相比较,发现有匹配的键值28,键值28对应的用户信息为(28,bv)。
场景2:增加100~110节点,为了平衡需要调整树结构;如果是中间增加数据,调整次数会更多
场景3:删除<35所有的数据,为了平衡需要调整树结构
规律总结:
6. 需求:查找ID为[12,29]的数据,是不是不怎么好读取
说明:
7.Mysql 索引结构
END