如何设计一个关系型数据库 and B树简单了解

首先,分为存储(文件系统)和程序实例两大部分。

程序实例划分

  1. 存储管理模块:将数据的逻辑关系转换成为物理存储关系。
  2. 缓存机制模块:优化执行效率。
  3. SQL解析模块:解析SQL语句。
  4. 日志管理模块:记录操作日志。
  5. 权限划分模块:进行多用户管理。
  6. 容灾机制模块:灾难恢复。
  7. 索引管理模块:优化数据查询效率。
  8. 锁管理模块:使得数据库支持并发操作。

缓存不宜过大,应该要有淘汰优化算法。
数据库的重点是索引和锁管理模块。

索引(以下答案不完善)

问:为什么要使用索引?
答:因为索引能够让我们避免全表扫描去查找数据,提升检索效率。

问:什么样的信息能成为索引?
答:主键、唯一键等,只要是能让数据具有一定区分性的字段都能成为索引。

问:索引的数据结构
答:主流是B+树,还有Hash结构还有BitMap等,其中Mysql数据库不支持BitMap索引,同时基于InnoDB和MyISAM的Mysql不显示支持Hash。

问:密集索引和稀疏索引的区别
答:1.密集索引文件中的每个搜索码值都对应一个索引值;
  2.稀疏索引文件只为索引码的某些值建立索引码;

在这里插入图片描述
注:一个密集索引注定了一个表的排列顺序,也就注定了一个表有且只能有一个密集索引;
   MyISAM中的主键索引,唯一索引,普通索引都属于稀疏索引,而InnoDB有且仅有一个密集索引,其他索引也可以有

二叉查找树的弊端:
数据库的执行效率瓶颈在于IO,而二叉树的数据结构导致每一层都要一次IO,所以当层数越大时查询次数越多,查找时间就会大大延长,所以二叉树查找无法大大提高数据库的查询效率。

B-Tree
  1. 根节点至少包括两个孩子;
  2. 树中每个节点最多含有m个孩子(m>=2);
  3. 除根节点和叶节点外,其他每个节点至少有ceil(m/2)个孩子;
  4. 所有叶子节点都位于同一层
    注:ceil函数返回不小于 value 的下一个整数,如果value不为整数的话;
    数据库的最小查询单位为块或页。
    以上规则可以让每个索引块尽可能的存储更多的信息,让树的高度尽可能减少IO的次数。

    此图为3阶树,上述所说的m就是几阶树的意思
    注:上图中间的P1和P3是有的,只是因为展示的美观而没有写出来
存储原则

假设每个非终结点包含有n个关键字信息,其中
   a) Ki(i=1…n)为关键字,且关键字按顺序升序排序K(i-1) <Ki;详解:
    就是说每个节点包含的信息都是从左到右升序排列,例如上面的8<12;
   b) 关键字的个数n必须满足:[ceil(m/2)-1] <n <=m-1;详解:
     上图为3阶B树,关键字个数比孩子树节点少一个。(这里个人的理解不够充分)

   c) 非叶子结点的指针:P[1],P[2],…,P[M];其中P[1]指向关键字K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其他P[i]指向关键字属于(K[i-1],K[i])的子树。解析:
     首先P[1]到P[M]是升序排好的数据,如上图第二列的P1对应的值是都比8小的,而P3对应的值则是都比12大的,剩下的中间P2对应的值都是在(8,12)区间内的。

相比二叉树的优点是:
当数据被打乱(增删改)时,二叉树可能会变成线性,而B树则会因为上述的三点原则而进行合并,分裂,上移,下移节点来保持B树的特征,并且B树比二叉树要矮的多,且不会出现变成线性的可能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值