1、遍历数据库
索引树的每一个节点都是一个页面。ui
索引树有三种类型的节点:根节点、中间节点、叶子节点。spa
(1) 根节点与中间节点同样,只包含下一层节点的入口值与入口指针,它们称为索引节点;3d
(2) 叶子节点包含要遍历的数据,对汇集索引而言数据就是表中数据行,对非汇集索引数据是指索引列值和行书签。指针
索引的遍历老是从根节点开始,即先根遍历,分为两种:索引扫描和索引查找。对象
(1) 索引扫描,是指从索引树的根节点开始,对叶子节点逐个扫描,直至命中全部知足查找条件的数据;blog
(2) 索引查找,是指从索引树的根节点开始,按查找值在索引节点中根据路由信息跳转,直至叶子节点以命中数据。索引
B+树的深度一般小于等于3,计算以下:事务
以汇集索引为例,简单计算以下:10个INT列宽度总和为40B,假设汇集索引树每一层为二叉,共三层,即2^0+2^1+2^2=1*(1-2^3)/(1-2)=7个页面,4个叶子节点,每一个页面8060K可存储8060000/40=201500行,乘以4=806000行,若是是三叉、四叉,那么三层可存储上千万至亿行的数据,固然在数据量达到这个等级时,一般咱们会选择表分区,那么B树深度就更不会突破三层了。路由
因此索引查找的效率是很高的,在查询中应该努力构造索引查找,避免索引扫描。
2、插入
2.一、页空间充足
在已存在数据的表上,建立或重建索引时,可指定填充因子,即在索引树的每一个节点上预留必定的空间,供表中后续增长的数据使用。但若是在建立表的时候就建立了索引,并指定了填充因子,这时的填充因子是无用的,数据库系统不会刻意去保留页面的空间。
索引页面有剩余空间的状况以下图:
参考上图,此时向索引树中插入一条索引键值为31的记录,步骤以下:
(1)执行索引键值=31的查找操做,肯定该新记录应该插入到叶子节点L2中。
(2)检查L2上是否有足够的空间来存放当前记录,这里假设有足够的空间;
(3)将记录45向后移动,插入索引键值为31的新记录。插入以后,十、30、3一、45仍是顺序的,以下图:
2.二、页空间不足
参考上图,此时再插入一条索引键值为32的记录,步骤以下:
(1)执行索引键值=32的查找操做,肯定该新记录应该插入到叶子节点L2中;
(2)检查L2上是否有足够的空间来存放当前记录,这时发现没有足够的页空间,此时须要进行页面分裂;
(3)向数据库系统申请一个新的页面L4,将L2的一半数据移到L4中,并从新连接叶子的左右节点,以下图:
(4)此时,上层节点也须要生成一个新的叶子节点的指针。这里的上层节点即根节点,若是上层节点没有剩余空间的话,一样也须要进行分裂,这里有剩余空间,以下图:
(5)由于当前记录的键值范围位于页分裂的后一半中,将索引键值为32的新记录插入到L4中,若是键值范围位于前一半,则插入到L2中。若是L4的空间不够存放键值为32的新记录,则L4会继续进行页分裂,这里假设空间足够,插入结束,以下图:
3、删除
3.一、删除叶子节点中的记录
参考上图5,删除索引键值为32的记录,步骤以下:
(1)执行索引键值=32的查找操做,肯定该记录在L4中;
(2)将索引键值=32的记录标记为虚影,但并不当即释放空间,虚影记录可用于事务回滚、多版本等;
(3)若是此时L4上的虚影记录空间被申请使用,虚影记录就会被擦除;
(4)若是数据页面最后一条记录也被删除,数据页面会被回收;
3.二、删除非叶子节点中的记录
(1)索引节点中的指针被删除时并非虚影记录,但一样也不释放空间,直到有新的指针插入时,才会进行空间压缩;
(2)堆表中数据行被删除后,页空间不会被回收,即便是空闲分页也仍是标识为分配状态,没法被其余对象使用;
注:从理论上讲,在兄弟节点页面空闲空间都小于50%时,应该将兄弟节点合并,即分裂的逆操做,但这样可能带来的后果是更频繁的页面合并、分裂,成本更大,因此在数据库系统中一般不进行页面合并操做,除非rebuild/reorganize索引。
4、更新
4.一、覆盖更新
若是更新操做可以在页内进行原位键值替换,那么就进行覆盖更新。
4.二、非覆盖更新
没法进行覆盖更新时,更新操做被分解为删除和插入操做。
若是非覆盖更新过程当中,新的记录比较长,则会在页面分裂的过程当中会带来数据行的移动:
(1)汇集索引的移动对非汇集索引没有影响,由于非汇集索引中存储的是汇集索引的键值,分裂并不会改变键值;
(2)堆表中的数据页分裂,会在原记录处留下一个前转指针,以告诉非汇集索引去哪里找新的记录;
因此数据行的移动对非汇集索引都不会带来维护的成本,非汇集索引的维护成原本自书签的变化:
(1)汇集索引的键值发生变化或被删除;
(2)堆表中的数据行被删除。
-------------------------------------------------------------------------------------- 原文转自:http://qianzhang.blog.51cto.com/317608/1217346--------------------------------------------------------------------------------------