AVL Trees (Balanced binary search trees)
平衡二叉树的定义:左右子树深度差绝对值不能超过1。
是什么意思呢?比如左子树的深度是2,右子树的深度只能是1 或者3。
这个时候我们再按顺序插入1、2、3、4、5、6,一定是这样,不会变成一棵“斜树”。
那它的平衡是怎么做到的呢?怎么保证左右子树的深度差不能超过1 呢?
https://www.cs.usfca.edu/~galles/visualization/AVLtree.html
插入1、2、3。
我们注意看:当我们插入了1、2 之后,如果按照二叉查找树的定义,3 肯定是要在2 的右边的,这个时候根节点1 的右节点深度会变成2,但是左节点的深度是0,因为它没有子节点,所以就会违反平衡二叉树的定义。
那应该怎么办呢?因为它是右节点下面接一个右节点,右-右型,所以这个时候我们要把2 提上去,这个操作叫做左旋。
同样的,如果我们插入7、6、5,这个时候会变成左左型,就会发生右旋操作,把6提上去。
所以为了保持平衡,AVL 树在插入和更新数据的时候执行了一系列的计算和调整的操作。
平衡的问题我们解决了,那么平衡二叉树作为索引怎么查询数据?
在平衡二叉树中,一个节点,它的大小是一个固定的单位,作为索引应该存储什么内容?
它应该存储三块的内容:
第一个是索引的键值。比如我们在id 上面创建了一个索引,我在用where id =1 的条件查询的时候就会找到索引里面的id 的这个键值。
第二个是数据的磁盘地址,因为索引的作用就是去查找数据的存放的地址。
第三个,因为是二叉树,它必须还要有左子节点和右子节点的引用,这样我们才能找到下一个节点。比如大于26 的时候,走右边,到下一个树的节点,继续判断。
如果是这样存储数据的话,我们来看一下会有什么问题。
在分析用AVL 树存储索引数据之前,我们先来学习一下InnoDB 的逻辑存储结构。