文章目录
一、MySQL数据库索引底层数据结构详解
建立索引就是建立数据结构存储数据,让其有序,那么排序的时机应该怎么选择:
- 如果查询前进行排序,那么查一次,排序一次,那么排序的效率要插入到查询中,时间复杂度为:排序时间+查找时间=O(n)+O(logxn),比顺序排序的效率都要低
- 在插入数据时排序,在插入数据时,进行排序,为O(n),那么查询效率为O(logxn)。
MySQL数据库的索引设计思想就是在插入时进行排序,那么MySQL索引使用的数据结构是一种特殊的二叉排序(查找、搜索)树BST,称为B+树,是一种多路树。中序遍历有序。在插入时进行结点调整,使其有序。
B+树特点:多路树,非叶子节点放关键字进行排序,叶子节点以链表的方式串起来。
下面我们详细讨论索引的B+树。
(一)BST树,平衡二叉树AVL、红黑树,B(B-)树,B+树简介
1. BST二叉排序树
【概念:】
二叉搜索树BST(binary sort tree)以一颗二叉树来组织的,每个节点是一个对象,包含left指向节点的左孩子,right指向节点的右孩子,p指向双亲,key表示键值。
【目的:】
为了提高查找的性能,查找在平均和最坏的情况下都是logn,接近二分查找,查找的最大次数为树的高度。
【特点:】
- 每个节点的值大于其任意左侧子节点的值,小于其任意右节点的值,没有值相等的节点
- 中序遍历有序。
【缺陷:】
二叉搜索经过多次插入或删除后,会导致二叉搜索树失去平衡变为有n个节点的线性链:
此时查找的效率变得很低。
2. 平衡二叉树AVL
在二叉搜索树上添加平衡算法得到平衡二叉树AVL:带有平衡条件(节点的左右子树高度差不超过1)的二叉查找树,一般用平衡因子差值判断是否平衡并通过旋转来实现平衡。
特点:
- 左右子树高不超过1,是严格的平衡的二叉树。
- 执行插入,删除操作时,如果不满足平衡条件,需要通过旋转来保持平衡,耗费时间。
- 适用于插入删除次数少,查找多的情况。
不超过1表示可以取:0,1
局限性:
维护这种严格高度平衡的二叉树,付出的代价比效率还低,所以应用不多,适用于查找多,插入删除少的情况。一般应用于Windows进程地址空间的管理。
3. 红黑树RBT
AVL严格平衡二叉树实现耗费时间多,所以出现了弱平衡二叉树,基于二叉查找树的红黑树。
在每一个节点增加一个表示节点颜色的存储位,可以是红色或黑色。通过对任何一条从根到叶子的路径上各个节点着色的方式的限