一、运用二叉查找树优化索引

首先需要知道什么是二叉查找树 二叉查找树是每一个节点最多有两个子树的数结构 通常左边的树称为左子树 右边的树称为右子树
简单分析数据库索引的数据结构
比如说这一棵树 根结点为5 那么根结点的左子树均小于5 根结点的右子树均大于5
二叉查找树用的是二分查找 复杂度为O(logn) 其查询效率是非常高的 但是会有缺点
就例如说上图的树 删除2结点和6结点 然后插入11结点
简单分析数据库索引的数据结构
这样这颗二叉查找树就变成了线性结构 查询效率大大降低 复杂度为O(n)
但有人会有疑问 为什么不利用树的旋转特性 来使这棵树维持平衡二叉树状态呢 维持在O(logn)上
如果我们采用树的旋转型来维持平衡二叉树 影响程序运行的瓶颈就在于磁盘IO 众所周知 IO运行的效率是非常低的
每一层都会发射一次IO 当遇到树的深度非常深的时候 那么需要进行多次IO 这时候效率是及其低下的 甚至比全表扫描还要低 那么就没有必要使用这种方法了 我们就想办法让树从高瘦变的矮胖 这时候就引入了B-Tree数据结构

二、B-Tree优化索引

B-Tree也就是我们常称的B-树 也叫平衡多路查找树
首先来一个三阶B-Tree瞧一瞧
简单分析数据库索引的数据结构每一个存储块中主要包含了关键字和存储孩子的指针 如下图
简单分析数据库索引的数据结构
最多能有几个孩子 主要取决于存储块的容量以及数据库的相关配置 通常情况下 m阶树中的m是非常大的
看完了B-Tree长啥样 我们来了解下B-Tree的特征

举例 m阶B-Tree
1、首先B-Tree的根节点至少包括两个孩子
2、每个结点最多包含m个孩子 (m>=2)
3、除了根节点和叶子结点之外 每个结点至少包括 ceil(m/2)个孩子
4、叶子结点都位于同一层上
5、关键字的特征(约束): 这里我就用白话文讲了 还能明白
	(1)、每一个存储块中的关键字都是按照 从小到大排序 
	(2)、关键字的个数都要比同一存储块中的孩子数量少一个 个数限制为 ceil(m/2)-1<=x<=m-1
	(3)、非叶子结点的指针:P[1]指向关键字小于K[1]的子树 P[M]指向关键字大于K[M-1]的子树 其余P[i]指向关键字属于(K[i-1],K[i])的子树

了解完B-Tree 来了解一下更好的树 B±Tree

三、B±Tree优化索引

B+树是B树的升级版 定义基本和B树是相同的 与B树同理 我们先来看看B+树长什么样子

简单分析数据库索引的数据结构

看完这个 我们再来张B树来对比一下
简单分析数据库索引的数据结构

看了两棵树 那不同之处就清晰可见了吧

1、非叶子结点的指针与关键字的个数是相同的
2、非叶子结点的子树指针P[i] 指向关键字[K[i],k[i+1]) 这里要注意了 要看区间范围 是左闭右开 为什么呢 具体看下面的第三条
3、非叶子结点只用来做索引 数据都保存在叶子结点中 这里就明白第二条了吧
4、所有的叶子结点都有一个链指针指向下一个叶子结点 链接起来可以方便我们做范围统计 横向的跨指数做统计

综上所述 是不是B+树更加适合用来做存储索引

答案是肯定的 因为它是终极进化
下面就来说原因
1、B+树的磁盘读写代价更低 B+树内部并没有指向关键字的指针 即没有存储数据 数据都存储在叶子结点中
2、B+树的查询效率更加稳定 因为叶子结点存储的数据 要查询数据必须要走一条从根节点到叶子结点的路 所有关键字查询效率是相同的
3、B+树更加有利于数据库的扫描 B+树只要遍历叶子结点就行 可以利用叶子结点的链指针进行范围查询 

四、Hash索引也优化索引

在了解这个Hash索引之前 我们需要知道什么Hash查找 就是通过Hash函数的运算只需要一次定位 就能找到所需的头 Hash索引理论查询效率高于B+树索引
下面来看图实际来了解一下Hash索引
简单分析数据库索引的数据结构
就比如说需要查找Sandra Dee 先要通过Hash函数计算 找到头 152的buckets 然后进入entries的链表 逐一查找即可
但是我们肯定有疑问 Hash索引的效率要快于B+树 那么为什么B+树还是主流索引呢
这个问题肯定是因为Hash索引有缺点所以没有主流 下面就来了解下缺点

1、Hash索引仅能满足 = 和 IN 不能进行范围查询 因为Hash索引比较的是进行Hash运算后的Hash值 只能用于等值的过滤 不能进行范围查询
2、无法被用来避免数据的排序操作
3、不能利用部分索引键查询(这个我有疑问 不理解 还望理解的评论一下 谢谢)
4、不能避免表扫描 Hash索引是通过Hash运算之后将运算结果的Hash值和所对应的行指针信息存储到Buckets中的 不能通过Hash索引直接完成查询 还是要通过访问这个Buckets中的实际数据进行比较
5、遇到大量Hash值相等的情况后性能并不一定就会比B+树效率高

五、BitMap来优化索引(神器)

BitMap也叫位图索引
BitMap的使用情况是 当表中的某个字段只有几种值的时候 比如说要表示性别 只有男女两种情况 如果只是为了在这个字段上实现高效的统计 那么位图索引是最佳的选择 但是目标很少数据库支持位图索引 主流Oracle位图索引
知道了用处之后 我们来实际看一下位图索引吧
简单分析数据库索引的数据结构当有该关键字的时候 就为1 否则为0
位图索引虽然查询快 但是只使用某个字段只有固定几个 另外最大的缺陷是位图索引的锁力度非常大 不适合高并发的处理系统

以上就是常见的几种索引的数据结构了 写的不好 还希望多多指正

相关文章:

  • 2021-11-13
  • 2021-11-13
  • 2021-11-13
  • 2022-12-23
  • 2021-12-05
  • 2021-12-07
  • 2021-06-30
猜你喜欢
  • 2021-11-13
  • 2021-10-11
  • 2021-06-25
  • 2021-11-20
  • 2021-11-13
  • 2021-12-22
相关资源
相似解决方案