B树和B+树
1. 硬盘的结构
这是逻辑地址,并不是物理地址,同心圆称为轨道,扇形的区域成为扇区,因此每一块内存区域都可以被唯一的标识出来
块地址=轨道编号+扇区编号
在读取硬盘是,读取或硬盘读取存入时,都是以块为单位的,假设每块内存的大小为512,那么在内存中的编号就应该是0-511,地址成为偏移量,所以想要读取地址上某个具体的内容需要知道三个条件,轨道编号、扇区编号以及偏移量
2. 数据是怎样存储在硬盘上的
程序通过主内存去访问数据时,那么硬盘的数据必须先进入主内存,才能被访问到,然后在写入硬盘中,硬盘的数据不能直接被访问
3. 什么是索引
通过指针来记录、访问硬盘上快中存储的记录,这样就能够快速找到那个数,但是索引本身也需要存储到内存道中
假设此时索引的内存占用:id为10个字节 指针为6个字节,那么每个快中可以存储32条索引,100条数据也就需要3.几个块来存储索引,假设为4块,之前去寻找id等于5的用户,最多需要访问25个块,但是用了索引,通过地址来寻找,那么最多只需要访问4个块,一旦寻找到指定的数据表快,那么久在加上一个块,即为5块
对比:没加索引以前最多访问25个块
加入索引以后最多需要访问4+1个块
此时创建的是一个密集索引,因为它会为每个字段都去创建一个索引,比如一号索引,那么他就指向id为1的数据
4. 什么是多级索引
但是,随着数据数量的不断增加,索引也在不断的变大,那么就会考虑再去创建一个索引来指向这个索引
假设上一个索引有32条数据,创建一个索引用于访问这32条数据,那么33号索引就指向上一个索引的终点,也就是下一块的起点,这种索引叫做稀疏索引,即并不会为每条索引都去创建一个索引
虽然减少了访问块的数量,降低了搜索时间,但是也消耗了更多的内存
5. 什么是m叉树
我们知道二叉搜索树,左子树比根节点小,右子树比根节点大,当去做寻找是,如果比根节点小,那么就去查找左子树,如果比根节点大,那么就去查找右子树,但是,只能存放一个key 和两个子节点,此时就会希望再次出现一种搜索树,如上图
假如查找的数组为35,那么35比20大,比50小,能存放两个key 25 和 50 ,以及三个子节点,就会往中间进行查询,此时是一个三叉树
这个就是m叉树,或者说m叉搜索树,m叉树一共能存储m个子节点和m-1个key
这是一个4叉树的示意图
缺点:
创建过程不受到约束,没有创建过程的准则,可以随意创建,很有可能导致如下的结构
让整棵树像一个线性结构,这样去进行查找遍历,就会耗费很多的时间
6. b树
有创建准则的m树就是b树
-
根节点必须有两个以上的子节点
-
其他节点都必须创建一半以上的子节点才能够创建一个新的节点
-
所有的子节点都需要在同一水平
-
创建过程是自下而上的
每个节点都存放着key和指针
7. b+树
不是每个节点都存在指针,只有叶子结点记录指针,会在子节点中街路指针副本,所以树中的每个键都会出现在叶子结点中,叶节点连接,像链表,此时就成为了一个密集所有
8. b树和b+树的区别:
叶节点中所有的键,在非叶节点中只有副本,叶子节点中必须有所有的键,非叶节点中没有记录指针,就想一个链表
总结:
- B 树的所有节点既存放键(key) 也存放 数据(data),而 B+树只有叶子节点存放 key 和 data,其他内节点只存放 key(副本)。
- B 树的叶子节点都是独立的;B+树的叶子节点有一条引用链指向与它相邻的叶子节点。
- B 树的检索的过程相当于对范围内的每个节点的关键字做二分查找,可能还没有到达叶子节点,检索就结束了。而 B+树的检索效率就很稳定了,任何查找都是从根节点到叶子节点的过程,叶子节点的顺序检索很明显。