懂不懂MySql索引,你内心没点B树吗?

论数据库索引的重要性?
java

看图说话:数据库没加索引-龟速,数据库加了索引-火箭的速度,能够看出索引到底有多重要数据库


那么索引是什么?微信


索引是用来快速检索出具备特定值的记录。数据结构

MySql官方对索引的定义为:索引(index)是帮助MySql高效获取数据的数据结构。学习


那么MySQL到底是使用什么样的数据结构做为索引呢?大数据

目前,咱们将探索以下三种数据结构,二叉查找树、B-Tree、B+Tree
优化


1.  二分查找(二叉查找树或者是二叉搜索树)spa


下面咱们引出一个猜数字的问题.net


二分查找的时间复杂度是log2 N,表示以2为底N的对数,32次能够检索21亿的数据。指针


二叉查找树的特色:

1. 若是它的左子树不为空,则左子树上结点的值都小于根节点。

2. 若是它的右子树不为空,则右子树上结点的值都大于根节点。

3. 子树一样也要遵循以上两点。


为何又叫作二叉排序树呢?

只要一棵树是二叉搜索树,那么它的中序遍历必定是有序的。上面的那颗二叉树的中序遍历就是(左根右):0 3 4 5 6 8 10


二叉搜索树和平衡二叉树的关系:为何会引出平衡二叉树,就是说有了二叉树,为啥要有平衡二叉树。


看下面这棵二叉搜索树,若是我要查找10这个结点,是否是查找的结点要通过5 6 8 10这几个结点,你们仔细看看,是否是5 6 8 10 这几个结点从某种意义上讲就变成了单向链表的结构,也就是说二叉搜索树退化成了单向链表的结构,因此这时咱们引入了平衡树的概念。



 什么是平衡二叉树?AVL树 ,三个变化规则,变颜色,左旋和右旋 ,它也能够叫作红黑树


红黑树的特色:

1. 节点必须是红色或者黑色。

2. 根节点必须是黑色。

3. 叶节点(NIL)是黑色的。(NIL节点无数据,是空节点)

4. 红色节点必须有两个黑色儿子节点。

5. 从任一节点出发到其每一个叶子节点的路径,黑色节点的数量是相等的。


红黑树:HashMap

不适合磁盘存储的数据,也不适合存储大量的数据,由于IO浪费太大,读取的资源也浪费太大。HashMap为何又要用呢?HashMap是在内存而不是磁盘。红黑树不能用做MySql的索引。


2. B-Tree(B树)

    

B-Tree建立过程详细介绍:


M阶的B-Tree的几个重要特性:

1)结点最多含有M颗子树,最多含有m-1个关键字(数据)(m>=2)

2)除了根结点和叶子结点外,其余每一个结点至少有ceil(m/2)个子结点,ceil为上取整

3)若根结点不是叶子结点,则至少有两颗子树


例子:建立一个5阶的B-Tree。插入的数据有:

3 14 7 1 8 5 11 17 13 6 23 12 20 26 4 16 18 24 25 19


1)根据B-Tree的特性,5阶则一个磁盘空间最多有5个指针(存的查找路径),4个关键字(MySql存的数据),具体的插入过程以下:


插入3

插入14

插入7

插入1

插入8,此时发现空间不足,这是会出现一个分裂,移动中间元素到根结点即获得以下图:

插入5

插入11,17

插入13:须要注意,此时B-Tree又会进行一次分裂,此次分裂须要注意下13会移动到根结点

后面的插入就不一一举例了,本身验证下,最后获得以下图所示的树:


假如MySql存储的数据放在以下图所在的data中:

以上的Data就是真实的MySql的data,每一个结点都会存储一个data,你们发现有没有问题,其实它是有问题的,虽然解决了磁盘分页的问题,由于每个结点会拉取不少的数据,可是仍是会浪费IO,它比红黑树节省空间不少。可是MySql仍是不会用它。


3. B+Tree(B+树)MySql用的就是B+Tree

MySql终极解决方案就是:优化CPU+Mem+IO,因此就是使用B+Tree。


B+Tree的性质:

(1)每一个节点最多有M个子节点

(2)除根节点外,每一个节点至少有m/2个子节点,注意若是结果除不尽,就向上取整,好比5/2=3。

(3)根结点要么是空,要么是独根,不然至少有2个子节点

(4)有k个子节点的节点必有k个关键码

(5)叶节点的高度一致



下面咱们看一下B+Tree插入数据的过程:3阶的B+Tree插入1四、17


插入14:

插入17

总结:


二叉查找树、红黑树、B-Tree、B+Tree的区别:


二叉查找树:二叉搜索树,优势查找快,可是在某些状况下会退化成链表,它是全部高效查找树的基础,根本性的东西


红黑树:内存查找高效树,不适合大数据量,也不适合磁盘存储。具体的分析就是IO浪费,以及读取资源浪费,还有就是树的深度会很大。适合一些底层运算。


B-Tree: 能够认为是B+Tree的过渡。


B+Tree: 最适合大数据的磁盘存储,经典的MySql,全部的数据都存储在叶子节点。其余的都是索引,增长了系统的稳定性以及遍历、查找效率


B-Tree和B+Tree不一样:关键字和key值,能够参见数据结构图,B+Tree的叶子节点增长了双向链表。


M阶:这个由磁盘的页面大小决定,磁盘和页内存都是4KB。咱们的节点数也就是咱们的M值,应该尽量和它保持一致。

本文分享自微信公众号 - Java学习进阶手册(javastudyup)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索