索引是什么
索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构
工作机制
在关系型数据中是硬盘级的索引,索引id 对应的磁盘的地址,通过磁盘地址找到相关的数据
为什么用B+Tree
我们看一下二叉查找树
- 看一下二叉树,通过二分查找,可以减少一些查找,它的算法复杂度是log2(N),但是存在一定的问题,如果树的都大或者都小,那就成了链表式的,查找的效率就很低了,如下图。
- 为了解决上面的问题我们可以通过平衡二叉树
平衡二叉查找树是相对平衡二叉树
它的定义:一个节点的子节点高度差不允许超过1
为什么我们不用平衡二叉查找树?而用B+Tree
因为它存在一定的缺陷
- 树的深度决定IO的操作次数,树的深度过高,频繁的操作IO的次数太多,搜索的效率不足。
- 每个节点存储的内容太少,每次IO加载的数据一个,我们操作系统和磁盘交换的单位是页,一个页的内容是很大,比如4k,如果内容太少,一次IO只返回一个字节,没有很好的利用操作系统和磁盘的数据交换特性和磁盘预读能力(空间局部性原理)
为了解决上面的缺陷,我们引入Balanced Tree(多路平衡查找树)
Balanced tree(多路平衡查找树)
我们能看到B树(多路平衡)树能解决树的高度和存储的数据,但是我们的mysql 中还是没选用B树呢?下面的我们看一下B+Tree
加强版多路平衡查找树B+树
B+树是B树的plus tree
- B+节点关键字搜索采用闭合区间
- B+非叶子节点不保存数据相关的信息,只保存关键字和子节点的引用
- B+关键字对应的数据保存在叶子节点中
- B+叶子节点是顺序排列的,并且相邻节点具有顺序引用的关系
采用左闭合区间
- 是因为它要把所有的数据保存在叶子节点。
- 因为在mysql中它会认为你的默认的索引,不指定主键索引的话它采用的自增数据结构或者自增的一种机制,它会认为它的最长变的是右边,左边是不长边的
Mysql为什么要选用B+Tree?
- B+树是B-树的变种(Plus版)多路绝对平衡查找树,它拥有B-树的优势
- B+树扫库,表能力更强
- B+树的磁盘读写能力强
- B+树的排序能力更强
- B+树的查询效率更加文档