数据库原理与设计
1、分析B+树、LSM树作为存储引擎数据结构的特点
B+树:
- 每个节点中的元素从小到大排列
- 对于每个非叶子结点,其左子树中的所有key都小于它,右子树中的key都大于等于它
- 所有的叶子结点都位于同一层
- 非叶子节点只存储key和指针
- 叶子节点存储data(带顺序访问的B+树还会存储一个指向相邻叶子节点的指针)
- 一个节点的大小为一页
LSM树:
- 由两个或以上的存储结构组成
- 是一个多层结构,上小下大
- 每一层都是有序的
- 第一层在内存中,其他层在磁盘中
2、分别写出读请求(点查)和写请求(插入)访问上述对应数据结构时的访问流程
B+树:
- 读请求
- 访问根节点,二分查找
- 访问相应的子树,二分查找
- 重复步骤2,直到查询到对应的data
- 如果是聚集索引则结束;如果非聚集索引,则把得到的data当成key去聚集索引里查找data
- 写请求
- 若为空树,创建一个叶子结点,然后将记录插入其中,此时这个叶子结点也是根结点,插入操作结束。
- 针对叶子类型结点:根据key值找到叶子结点,向这个叶子结点插入记录。插入后,若当前结点key的个数小于等于m-1,则插入结束。否则将这个叶子结点分裂成左右两个叶子结点,左叶子结点包含前m/2个记录,右结点包含剩下的记录,将第m/2+1个记录的key进位到父结点中(父结点一定是索引类型结点),进位到父结点的key左孩子指针向左结点,右孩子指针向右结点。将当前结点的指针指向父结点,然后执行第3步。
- 针对索引类型结点:若当前结点key的个数小于等于m-1,则插入结束。否则,将这个索引类型结点分裂成两个索引结点,左索引结点包含前(m-1)/2个key,右结点包含m-(m-1)/2个key,将第m/2个key进位到父结点中,进位到父结点的key左孩子指向左结点, 进位到父结点的key右孩子指向右结点。将当前结点的指针指向父结点,然后重复第3步。
LSM树:
- 读请求
- 在内存中查找(C0)
- 若未命中,则依次往下层查找
- 重复2步骤,直至找到
- 写请求
- 日志先行,既先插入操作日志
- 随后将新纪录的索引插入到C0(内存中)
- 当C0达到一定的阙值,数据顺序刷到C1并与之合并,以此类推