06-MySql 索引-上(数据结构)

MySql索引

  • 索引是一种加快表记录检索的数据结构。
减少查询时需要扫描的数据条数
可以把随机IO变成顺序IO
在分组和排序操作时避免使用临时表   

一、数据结构

  • 很多数据库的索引都采用树的数据结构,但是树有很多种不同的变形,在MySql中,索引使用的是B+树的数据结构。

1.1 二叉树

  • 也叫二叉搜索树,二叉查找树。
  • 高度差没有限制,只是满足基本的二叉树左小右大的特点,在数据分布不均匀时有可能会退化成链表,

1.2 平衡二叉树

1.2.1 定义
  • 也叫AVL树。它要么是空树,要么它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。
  • 平衡二叉树和AVL树是通过旋转来保证高度的要求。
1.2.2 缺点
  • 使用AVL树做索引或者类似于文件系统的缺陷
1.树的高度太大,导致IO次数过多。
2.二叉树高度太大导致逻辑上很近的点实际上可能很远,无法很好的利用空间局部性原理
3.二叉树做索引,数据量很大的时候无法将索引全部放进内存的,而索引的维护需要对整棵树进行旋转操作,部分加载到内存则无法完成旋转操作

1.3 B-树(多路平衡查找树)

  • 将度数由2增大是B-数和平衡二叉树最大的区别。(多路平衡查找树,注意是读B树,而不是B减树),
1.节点的最大子节点个数成为度,简称N。多路平衡查找树N大于2,每个节点关键字个数为N-1,它是绝对平衡的,并且满足所有子节点在一个高度,因为N大,因此B-树查找的数据比AVL树要多得多。
2.维持整个树高度差不大于1这一点不是靠旋转,而是靠节点的分裂和合并,叶子节点和非叶子节点都保存了数据和引用,因此节点的大小相近。 
3.所有叶子节点在同一层。

1.4 B+树(加强版多路平衡查找树)

  • 由B-树演进而来,改进点如下:
1.度数N和节点关键字个数一样(而不是相差1),非叶子节点只保存关键字的引用(因此路数会更多)不保存数据,数据保存在叶子节点,因此非叶子节点比较小
2.叶子节点保存了数据并且前后通过引用相连,便于范围查找
3.度数N取决于关键字的大小,关键字越小,N越大

二、B+树和B-树

  • 区别
B-树B+数
所有节点都保存数据,节点大小差不多非叶子节点不保存数据,叶子节点才保存数据,非叶子节点更小,度数更大
查询性能不稳定,最好为O(1),最坏O(logN)查询性能稳定,O(logN)
叶子节点相互独立,不擅长范围查找相邻叶子节点通过指针保持顺序的引用关系,擅长范围查找,很好的利用空间局部性原理
  • 为什么选择B+树作为mysql的索引,而不是B树?
B+树是B-树的变种,是多路绝对平衡的查找树,具备B-树的优点
B+树扫描库和表的能力更强
B+树的磁盘读写能力更强(路数更多)
B+树的排序能力更强(叶子节点是排序的)
B+树的查询效率更加稳定(算是特点,并不一定是绝对的优点,因此一定要加载到叶子节点才能找到数据,因此复杂度比较稳定)

三、Mysql和mongodb的索引树

3.1 mysql和B+树

  • Mysql使用B+树作为索引的数据结构。 MySql是关系型数据库,区间访问是常见的一种情况,而 B-树并不支持区间访问,而B+树数据全部存储在叶子节点并通过指针串在一起,很容易的进行区间遍历甚至全部遍历。
  • 其次B+树的查询效率更加稳定,数据全部存储在叶子节点,查询时间复杂度固定为 O(log n)。
  • B+树更适合外部存储。由于内节点无 data 域,度数更大,每个节点能索引的范围更大更精确

3.2 mongodb和B-树

  • mongodb使用B-数作为索引的数据结构。
  • MongoDB 是一种 nosql,也存储在磁盘上,被设计用在数据模型简单,性能要求高的场合。性能要求高B-树查询时间复杂度不固定,与 key 在树中的位置有关,最好为O(1)。很多情况下可以提高检索速度。
  • mongodb是一款内存型数据库,索引和热数据都保存在内存,要求查询性能比关系型数据库很快,因此无法识别B+树,因为B+树的数据一
    定要找到叶子节点才行,而mongodb可能很多时候在内存中的索引节点上就把数据找到了。

四、参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值