数据库——底层原理

数据库

1.底层数据结构

B树是树的衍生,所以我打算从树开始讲起。

我们都不陌生,有一个根节点,从根结点出发有他的孩子节点。但是简单的一棵树并没有什么特点,可能很难被实际应用。

之后出现了二叉树,这种树的每个节点最多只有两个孩子,这样一来,通过二叉树来实现二叉查找很大的提高了查找的速度。但是又有一个新问题出现了,除非二叉树被事先给出,否则二叉树可能会退化为链表。

再后来,为了解决退化问题,平衡二叉树被设计了出来,能够自动的根据树的高度来调节结点,使树上的节点分布均匀。再后来,不止对平衡二叉树进行查询操作,增加和删除结点效率的要求也提高了,因为如果要进行删除和增加节点,就需要维护这个二叉树保持原来的特点。

最后,为了解决增加和删除结点的效率,红黑树又出现了,在查询效率上,二者可能差不多,但是在修改结点的效率上,存在很大的差异。

(转载)红黑树和平衡二叉树的区别

随着大数据时代的到来,动辄就是千百万的数据量,使用二叉树来组织数据根本行不通,因为根据满二叉树的计算n = Log(2,N),查询时间还是不理想。

B树

关于B树的特点都已经展示在图中。为了降低二叉树的层数,在B书中,每个“结点”不止存放一个数据,目的就是为了增大每个结点所能容纳的数据量,降低树的层数。
在这里插入图片描述
(关于B树的严格定义请自行百度)

  1. 每层包括N个实体结点和N+1个指针结点
  2. 每层结点都按照结点的Key值非递减的顺序排列
  3. 在Key值之间存在一个指针指向下一层结点,其中的Key值自然也是处于上层两个Key值之间
  4. 每个结点都直接带有自己的Data
  5. 对应每条记录都遍布在整个树中
B+树

B+树很大程度上是为了满足范围查找的需要,所以用双链表将所有的叶子结点都串起来;而且根据在磁盘I/O上所花的时间,要尽可能的减少磁盘I/O(每层的一个大结点通常被安排在一块物理内存上),所以会将所有的实体记录放在叶子节点上,非叶节点只存放键Key,不存放Data,这样一层的大结点能够存放更多的结点Key值,从而相应的减少磁盘I/O提高性能。
在这里插入图片描述
(关于B+树的严格定义请自行百度)

  1. 真实结点只放在叶子节点上,非叶节点只存放Key值
  2. 用双链表将叶子节点串联
  3. (这里还推荐使用Mysql中的自增主键,因为在随机插入时,难免会引起当前节点已经放满,再放时会出现分裂的操作,而按顺序递增的插入只会再最右边插入结点,并不会有分裂操作,效率较高)

2.Mysql数据库引擎

Innodb:Data数据直接存在于索引的叶节点中,支持事务,聚簇索引(数据和索引放一起,默认是主键完成,再次唯一非空索引,隐式索引,均称为辅助索引),不支持全文索引,最小粒度行锁
MyIsam:叶节点中只存放了Data的指针,不支持事务,非聚簇索引(数据和索引不放一起,存放地址),支持全文索引,最小粒度表锁

3.最左前缀优化原则

在生成索引时,如果是联合索引,则将会根据联合索引声明的顺序组织B+树的非叶节点,所以在使用Select在索引上查询时,会根据联合索引的顺序对每层节点进行排序,这才需要在使用Select语句时,注意是否使用了索引。

(未完待续。。。)

4.覆盖索引

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值