为什么提高文件索引
首先cpu不能和磁盘进行直接交互,需要通过缓存到内存中,在交给cpu进行处理,但是cpu的处理速度很快,而内存与磁盘之间需要读取特定的文件,但是如果磁盘查找文件的效率很慢,那么cpu就算运行速度再快,但是磁盘找文件的速度很慢,那么整个处理过程的速度就降了下来。
其他数据结构不能做索引的原因
数组
文件按照数组的方式存放在磁盘中,地址空间连续
假如说现在需要查找文件4,那么我需要从文件1开始进行线性查找,直到找到文件4,线性开销太大
而且现在需要删除文件2,文件3与4都需要迁移
哈希表
假如说我们现在定义了一个hash规则,Hash(key)=key%8
首先我们清楚哈希表时数组+链表的方式,那么假如说一个文件经过算法计算出hash值为9,那么就将存储到1的那个位置
优点:查找单个等值查询非常快,比如我们要查找的文件hash值计算为3,那么我们可以一次性就查找出索引为3的位置的文件
缺点:这是一个hash表,无论中间计算的hash的过程多么好,但是避免不了hash冲突的问题,假如说上面这个算法插入文件10000个都在1处,那么查找最终的插入的一个文件就要比较10000次,反而成为了线性查找,效率低
树
如果仅仅是一个普通的树的话,那么还是需要按个进行遍历的
这个数并没有什么特殊的规律
二叉搜索树
二叉搜索树是要求每一个节点的左子节点比该节点小,右子节点比该节点大
优点:平均时间下查找数据的速度很快,O(log n)
缺点:如果说插入的数据时候,按照从小到大是顺序进行插入,或者从大到小的顺序插入,那么查找效率是又成为了线性查找
二叉平衡树(AVL)
二叉平衡树要求左右子树高度差的绝对值为0或者1
优点:二叉平衡树很好的解决了二叉搜索树的问题,使得他的发查询效率不会出现极端的情况
缺点:每一次插入都需要检测是否满足平衡树,而且还要调整整个文件索引的结果(将树旋转,使其满足平衡),用插入的成本开销来换取查找的成本开销
所以说AVL树适合插入操作少,但是查询操作多的情况,但是文件索引系统肯定要同时兼顾两种情况
红黑树
对于上面的二叉平衡树,如果我们减少调整文件索引的次数,那么这样是不是就会更好??
红黑树:最长子树不超过最短子树的2倍即可
优点:此时红黑树对于相比较于平衡树的情况,旋转调整的次数比较少了
那么此时这样的红黑树是不是很完美了吗???
缺点:但是遇到大量的数据的时候,文件索引形成的红黑树深度会很深,那么此时查找的效率还是会很低
小总结
其实面对上述的三种树结构的各种问题,我们会发现他们都是二叉树,那么就会在成每一个节点的左右只能存储2个数据索引,这样的话,无论结构多么优化,文件增多,深度必将会增加,索引的效率也会下降
B树
终于把B树搞明白了(二)_什么是B树,B树的特点_哔哩哔哩_bilibili
满足下列要求的m叉树就是B树:
在有序树中的基础上每一个节点至多有m个孩子节点(至多含有m-1个关键字)
而对于B树来说,每一个节点结构如下
下面是一个B树的结构
那么对于B树来说,查找还是按照顺序大小来进行,比如说现在查找30
将第一行读入磁盘,发现30小于37,于是要读取地址1指向的结构
当把下面的结构读入地址之后,发现30大于25,于是查找地址2的结构
现在进入到这个结构之后,会发现30的文件,成功找到文件
我们会发现这个B树的构成深度比二叉树的深度小了很多,那么比较的次数也会下降,IO次数也会下降,速度将会提高
当然B树也有缺陷,这些缺陷也是引入B+树的原因,这里不做解释