B树+改进 = B+树

1 索引是什么?

就像一本书前面的目录,能加快数据库的查询速度。
索引文件也挺大的,一般存储在磁盘上

2 索引的优势和劣势

优势

  1. 可以提高数据检索的效率,降低数据库的IO成本
  2. 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。

劣势

  1. 占用磁盘空间
  2. 索引虽然会提高查询效率,但是会降低更新表的效率。

3 索引类型

  1. 主键索引 --》(回表最终走这个), 索引列中的值必须是唯一的,不允许有空值。
  2. 唯一索引索引列中的值必须是唯一的,但是允许为空值。
  3. 普通索引,MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值。

补充:

联合索引
覆盖索引
最左匹配原则
前缀索引
对一列中前面几个字段建立索引

4 索引的数据结构

索引的数据结构

  1. Hash表在等值查询时效率很高,时间复杂度为O(1);
    但是不支持范围快速查找,范围查找时还是只能通过扫描全表方式。

  2. 二叉查找树
    如果树不分叉,会导致结果不太稳定啊

  3. 平衡二叉树(左小右大)
    时间复杂度和树高相关。树有多高就需要检索多少次,每个节点的读取,都对应一次磁盘 IO 操作。
    范围查询时需要从根节点多次遍历,查询效率不高。

5 B树(改造二叉树)(多叉平衡查找树)

  • 起因
    MySQL的数据是存储在磁盘文件中的,查询处理数据时,需要先把磁盘中的数据加载到内存中,磁盘IO 操作非常耗时,所以我们优化的重点就是尽量减少磁盘 IO 操作。访问二叉树的每个节点就会发生一次IO,如果想要减少磁盘IO操作,就需要尽量降低树的高度。那如何降低树的高度呢?

  • 过程
    假若一个节点中key为bigint=8字节,每个节点有两个指针,每个指针为4个字节,一个节点占用的空间16个字节(8+4*2=16)。

但是MySQL的InnoDB存储引擎一次IO会读取的一页(默认一页16K)的数据量。所以对每个节点可以存储1000个索引(16k/16=1000)

通过这样就将二叉树改造成了多叉树,通过增加树的叉树,将树从高瘦变为矮胖,大大减少IO流的操作,这种结构我们称为B树

B树特点

  1. B树的节点中存储着多个元素,每个内节点有多个分叉。
  2. 节点中的元素包含键值和数据,节点中的键值从大到小排列。也就是说,在所有的节点都储存数据。
  3. 父节点当中的元素不会出现在子节点中。
  4. 所有的叶子结点都位于同一层,叶节点具有相同的深度,叶节点之间没有指针连接。

B树举例及缺点
举例
在这里插入图片描述

6 B+树

缺点

  1. B树不支持范围查询的快速查找,你想想这么一个情况如果我们想要查找10和35之间的数据,查找到15之后,需要回到根节点重新遍历查找,需要从根节点进行多次遍历,查询效率有待提高。
  2. 如果data存储的是行记录,行的大小随着列数的增多,所占空间会变大。这时,一个页中可存储的数据量就会变少,树相应就会变高,磁盘IO次数就会变大。

B+树(改造B树)

  • 比较
    B+树和B树最主要的区别在于非叶子节点是否存储数据的问题,B+的设计主要是避免非叶子节点中存储数据,占用过多的内存。

    B树:非叶子节点和叶子节点都会存储数据。
    B+树:只有叶子节点才会存储数据,非叶子节点至存储键值。叶子节点之间使用双向指针连接,最底层的叶子节点形成了一个双向有序链表。

  • 注意
    叶子节点存储的是数据是整行的数据
    B+树举例

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值