索引模型(基础数据结构)
索引模型:哈希表、有序数组、搜索树,这里的模型是指索引的底层实现的基本数据结构,Mysql中不同的引擎对于索引的实现结构说的即是索引模型。
有序数组
有序数组这个在数据结构中是最基础的结构,也是最简单的,对比理解的话就是我们编程中常用的数组、链表,它是顺序排列连接的,空间分配上也是集中的。
可以依据有序表的基本算法二分查找来实现快速的查询,对于排序和区间查找也是十分便捷迅速的。使用链表结构,对于比对查询、区间查询是非常快的。
哈希表
哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的键即 key,就可以找到其对应的值即 Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。采用哈希算法,当出现地址冲突时,使用链地址法进行冲突解决。
采用哈希算法,优缺点也很明显,优点,Key因为不需要考虑顺序问题,插入时非常快,只需要无脑追加即可;缺点,因为key不是递增的,所以查询时无法支持排序,哈希索引也不支持部分索引列匹配查找。
搜索树
这里的搜索树,一般使用B树,这里补一下数据结构中的B树结构;说B树之前,先顺一个前置的知识点,平衡二叉树;
平衡二叉树
二叉树应该都不陌生,大学数据结构的基本入门,二叉排序树
是基于二叉树上多了个“有序”的概念,简单来说,即 左 < 右
或 右<左
,反正就是,树是按着顺序建立的 。
相比较普通的二叉树,二叉排序树具有“顺序”的特点,但是当极端情况下,即单边顺序排列下去,二叉排序树就成了单链表了,失去了树的意义,于是在二叉排序树的基础上进一步加强,即:满足二叉排序树特点同时又左右子树高度差小于等于1,就有了平衡二叉树
。平衡二叉树的特点如下:
-
二叉排序树
-
任何一个节点的左子树或者右子树都是「平衡二叉树」(左右高度差小于等于 1)
B树(平衡树)
平衡二叉树已经很好了,其因为顺序、且限制了树的饱和,于是使得平衡二叉树在检索时,具有很高的性能,复杂度才O(logN),此时影响查询性能的瓶颈就演变到节点数量N了;根据树的特点,进行比对计算的次数取决于树的高度,如果节点的数量固定,我们可以通过控制每层的节点数来控制树的高度,不拘泥于“二叉”这一特性,变成多叉的平衡树(B-树)。
B树是一个绝对平衡树,所有的叶子节点在同一高度。在每个节点存储多个元素,在每个节点除了指针节点外,还存储相应的数据;相比二叉平衡查找树,在整个查找过程中,虽然数据的比较次数并没有明显减少,但是磁盘IO次数会大大减少;B