INNODB引擎-索引与算法(一)

1、INNODB引擎索引概述

INNODB引擎常见的索引:

(1)B+树索引

(2)全文索引

(3)哈希索引

INNODB引擎所支持的哈希索引是自适应的,会根据表的使用情况,自动为表生成哈希索引,不受人为干预在一张表中是否生成哈希索引

B+树索引是目前关系型数据库查询最为常用和有效的索引,B+树不是二叉树,而是有平衡二叉树演化而来。

B+树不能准确定位到行数据,而是定位该行数据所在的数据页,然后将数据页加入缓存中,从缓存中获取查询数据。

2、数据结构与算法

2.1 二分查找法

二分查找法也称折半查找法,采取的是一种跳跃性思考方式,针对的是一组有序的数据。即先以该有序数组的中心位置的数据为比较对象,如果大于中心数据,则查中心数据的右半部的数据,舍掉左半部数据。这样就去掉了一半的数据,然后在找到右半部数据的中心数据,再做比较,如此循环查找下去。

二分查找的速度即logn,n为有序数组的长度。具体详解可查看算法图解该书。

2.2 二叉树和平衡二叉树

二叉树的数据结构,如下图:

 

图中,每个数字都代表着每个节点的键值,左边的键值小于根值,右边则大于根值。

再看下二叉树的查找速度,查找2、5、8分别是需要3次,3、7需要2次,6只需1次,所以平均值为(3+3+3+2+2+1)/6=2.3次,如果是顺序查找,则是(1+2+3+4+5+6)/6=3.3次,所以二叉树的查找速度是要优于顺序查找。

二叉树可以任意的构造,也会出现下面这样的情况:

 

改图查找起来,则平均速度为(5+5+4+3+2+1)/6=3.16次,则速度就与顺序查找差不多,若需要最大性能地构造一棵二叉树,则就引出了下面的新定义-平衡二叉树,或称AVL树。

平衡二叉树的定义为任何一个节点的子树高度差不能大于1。如果左右子树的高度相等,则叫做最优二叉树,由于最优二叉树需要大量的维护操作,所以一般情况下用户构造一棵平衡二叉树就可以。如下图,则是一棵最优二叉树:

 

2.3 B+树

B+树精简了解下:B+树是为磁盘或者其他直接取存的辅助设备设计的一个平衡查找树,其基本结构如下图:

 

这是一棵高度为2的B+树,每个数据页的最大存储条数为4条。

2.3.1 B+树的插入

B+树的插入主要分为三种情况:

 

拿例子说明下:

比如初始的B+树如下图,其中顶层的根数据页即索引页(IndexPage),地下的子树节点为Leaf页:

 

这时我们如果想要插入一个28的键值,会发现25、30所在的Leaf页有空位,则直接插入就ok。则该B+树就变成了下图:

 

这时我们接着插入一个70的键值,根据规则,就应该是插入到50、55、60、65这个Leaf页中,但是现在这个数据页位置已满,因此我们需要将该Leaf页拆分并且将该页的中位数提到索引页,则变成如下图:

 

这时接着插入95,会发现Leaf页已满,需要提取中心数据到索引页,索引页也是满的,也需要重新拆分,则变成下图:

 

因为B+树结构主要是针对磁盘,每次拆分的操作都会进行磁盘的操作,所以我们应该尽可能的减少磁盘的操作。因此B+树提供了类似于平衡二叉树的旋转功能。

B+树在插入时,如果该页数据满了,则会去左右兄弟节点查看是否有空余位置,如果有,则将数据移动到兄弟节点,同时更新索引页。而不是直接进行拆分操作。针对上面插入70键值,则实际发生的操作应该是如下图:

 

2.3.2 B+树的删除操作

B+树的删除操作会涉及到一个填装因子的概念,可以简单这么理解,上面提到每个页的最多可插入四条数据,如果这是有两条数据,则填装因子为50%。50%为B+树可设置的最小值。同插入一样,删除也需要考虑三种情况:

 

举个实例:

初始的B+树为下图:

 

这时删除25键值, 25所在的Leaf页去掉25后,恰好填装因子为50%,无需操作。25删除后,28键值更新到索引页,如下图:

 

这时接着删除60键值,会发现60所在的Leaf页填装因子小于50%,则需要合并到50、55的Leaf页,最顶层I索引页删除后,底下的两个索引页合并。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值