什么是索引
数据库查询是数据库的最主要功能之一,最基本的查询算法当然是顺序查找(linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,还有二分查找(binary search)、二叉树查找(binary tree search)等;每种查找算法只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构。所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。
几种数据结构的分析
二叉树
从算法逻辑上讲,二叉查找树的查找速度和比较次数都是最小的。但要考虑一些极端场景,比如:
如果数据是单边增长的情况 那么出现的就是和链表一样的数据结构了,树高度大。从Mysql的角度讲,我们不得不考虑一个现实问题:磁盘IO。
查找都是索引操作,一般来说索引非常大,尤其是关系型数据库这种,当数据量比较大的时候,索引的大小有可能几个G甚至更多,数据量大的索引能达到亿级别,所以为了减少内存的占用,数据库索引是存储在外部磁盘上的。
当我们利用索引查询的时候,不可能把整个索引全部加载到内存,只能逐一加载每个磁盘页,磁盘页对应索引树的节点。
红黑树
在二叉树的基础上多了树平衡,也叫二叉平衡树,不像二叉树那样极端的情况会往一个方向发展。
红黑树的特点:
- 节点是红色或黑色。
- 根节点是黑色。
- 每个叶子节点都是黑色的空节点(NIL节点)。
- 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
- 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
因为这些规则限制,才保证了红黑树的自平衡。红黑树从根到叶子的最长路径不会超过最短路径的2倍。当插入或删除节点的时候,红黑树的规则可能被打破。这时候就需要做出一些调整, 来继续维持我们的规则。
在大规模数据存储的时候,红黑树往往出现由于树的深度过大而造成磁盘IO读写过于频繁,进而导致效率低下的情况。
B-Tree
B-Tree的定义
- d为大于1的一个正整数,称为B-Tree的度。
- h为一个正整数,称为B-Tree的高度。
- 每个非叶子节点由n-1个key和n个指针组成,其中d<=n<=2d。
- 每个叶子节点最少包含一个key和两个指针,最多包含2d-1个key和2d个指针,叶节点的指针均为null 。
- 所有叶节点具有相同的深度,等于树高h。
- key和指针互相间隔,节点两端是指针。
- 一个节点中的key从左到右非递减排列。
- 所有节点组成树结构。
- 每个指针要么为null,要么指向另外一个节点。
为了提高查询效率,就需要减少磁盘IO数。为了减少磁盘IO的次数,就需要尽量降低树的高度,需要把原来“瘦高”的树结构变的“矮胖”,树的每层的分叉越多越好,因此B-Tree正好符合我们的要求,这也是B-Tree的特征之一。
原来的二叉树一个节点只存储一个数据,要想把它变“矮胖”,就需要在一个节点存储多个数据,同时为了查找必须保持节点结构的有序,这样B-Tree就应运而生了。B-Tree的特点就是每层节点数目非常多,层数很少,目的就是为了就少磁盘IO次数。
在B-Tree中进行查询时,在查询的中的比较次数其实不比二叉树少,尤其当单一节点中的元素数量很多时。可是相比磁盘IO的速度,内存中的耗时几乎可以忽略,所以只要树的高度足够低,IO次数足够少,就可以提高查询性能。
B+Tree
B-Tree有许多变种,其中最常见的是B+Tree,例如MySQL就普遍使用B+Tree实现其索引结构。
与B-Tree相比,B+Tree有以下不同点:
- 每个节点的指针上限为2d而不是2d+1。
- 内节点不存储data,只存储key;叶子节点不存储指针。
MySQL索引实现
后续补充。。。
参考资料:
https://blog.csdn.net/kongmin_123/article/details/82055901
https://blog.csdn.net/qq_36381855/article/details/80011876