什么是分裂

在开始介绍之前,我们先来搞清楚什么是索引分裂吧。“索引分裂”就是索引块的分裂,当一次DML事务操作修改了索引块上的数据,但是旧有的索引块没有足够的空间来容纳新修改的数据,那么将分裂出一个新索引块,旧有块的部分数据放到新开辟的索引块上去,这个过程就称为索引块的分裂(INDEX BLOCK SPLIT)。

如图1所示,当有新值插入到L4叶节点块的时候,此时L4叶节点块是“充满”状态,已经没有足够的空间来存储新值了,此时会在B2分支节点下,分裂出一个新的叶节点L5来存储新值。如果分支节点B2也是“充满”了呢?那就要进行分支节点的分裂,即在ROOT根节点下,分裂出一个新的分支节点出来。依此类推,如果根节点也“充满”了,则需要进行根节点的分裂。如果发生了根节点的分裂,也意味着B树的高度(BTREE LEVEL)增加了一个层次。对真正意义上的树来说,这种生长是好事,但对B树索引来说,这就不是什么好事情了,B树索引的高度需要严格控制的。

图1  新值产生索引分裂

分裂的类型

从上面的介绍来说,我们大致可以将索引分裂归为三种类型:根节点分裂、分支节点分裂、叶节点分裂。当然,也可以说是两种类型,因为根节点分裂实质上一种特殊的分支节点分裂。我们首要需要关注的是其中叶节点的分裂,因为它是最频繁发生,对性能影响最直接的因素。

我们说过分裂出新节点后,会将一部分旧有的数据放到新节点上去,按照数据迁移量的比例,我们又可以将索引分裂分为两种类型:9-1分裂和5-5分裂。如果叶节点和分支节点同时发生分裂,其分裂比例的类型是相同的,即要么都是9-1分裂,要么都是5-5分裂。

q  9-1分裂:绝大部分数据还保留在旧有节点上,仅有非常少的一部分数据迁移到新节点上。

q  5-5分裂:旧节点和新节点上的数据比例几乎是持平的。

我们通常所说的索引分裂,大部分情况都指的是9-1的分裂。当事务向索引的最右侧的叶节点上插入一条大于或等于现有索引块上最大值的数据,且该索引块上不存在其他未提交的事务,如果没有足够的空间,就会发生9-1分裂。

很遗憾的是,当发生左侧节点上插入数据的时候,发生9-1分裂就会出现一些问题。如图2所示,当向左侧分支节点插入新值,即使其兄弟右侧分支节点数据区中没有数据(或者说没有右节点),它们的父节点都会发生分裂,极端情况下甚至会促使B树的高度增长,这对索引性能来说是很悲剧的,这一缺陷在10g以前的版本中都是存在的。

图2  左节点9-1分裂

从Oracle 10g开始,对于左侧节点的数据插入行为,引进了5-5分裂的方式,修正了9-1分裂造成的缺陷。如图3所示,当左侧分支节点B1已经“充满”状态,会去判断其兄弟右侧分支节点B2是否有空间,如果有,则将部分数据(5:5的比例)迁移到右侧分支节点上,这样就避免了分支节点甚至根节点的分裂。

图3  左节点5-5分裂

5-5分裂的方式也不是万能的,如果过于频繁的5-5分裂也会造成索引空间使用率不高,使得索引结构看上去像一个“虚胖子”,不够“结实’,同样会造成性能问题。

那什么时候会发生5-5分裂呢?简单地来说就是在索引需要分裂,但不能进行9-1分裂的时候就会触发5-5分裂。这听起来像一句废话,可将9-1分裂的条件反过来看,也正是5-5分裂发生的条件:

q  左侧节点发生新值插入时(新值小于索引中的最大值);

q  发生DML操作,索引块上没有足够空间分配新的ITL槽;

q  新值待插入的索引块上存在其他未提交的事务。

对比一下9-1分裂和5-5分裂的发生场景。9-1分裂通常是索引的键值是递增的,表上的事务并发量比较低,可保证新的数据块上有较大的空闲空间插入新值。5-5分裂通常是表上的事务并发度较高,操作的数据是无序的,需保证分裂的新旧数据块上有相对较大的空闲空间以容纳新事务的操作。

总体来看,不论是9-1分裂还是5-5分裂,对于性能来说,都不是什么好事。索引块的分裂意味着索引数据一定范围上的重组,其维护代价都是非常高昂的,应该尽可能地避免不必要的分裂发生。

点一下在看再走吧

B树索引是怎么分裂的?相关推荐

  1. MySQL(InnoDB剖析):24---B+树索引(聚集索引与非聚集索引(辅助索引))、B+树索引的分裂

    一.B+树索引概述 B+树索引的本质就是B+树在数据库中的实现.但是B+索引在数据库中有一个特点就是高扇出性,因此在数据库中,B+树的高度一般都在2~4层,也就是说查找某一键值的行记录最多只需要2~4 ...

  2. MySQL(InnoDB剖析):---B+树索引(聚集索引与非聚集索引(辅助索引))、B+树索引的分裂

    小伙伴们大家好!今天是大年三十,给大家拜个早年!在此小弟祝各位大哥们与家人团团圆圆,和和睦睦,新的一年身体健康,工作顺利! 一.B+树索引概述 B+树索引的本质就是B+树在数据库中的实现.但是B+索引 ...

  3. mysql索引如何分裂节点_从MySQL Bug#67718浅谈B+树索引的分裂优化(转)

    原文链接:http://hedengcheng.com/?p=525 问题背景 今天,看到Twitter的DBA团队发布了其最新的MySQL分支:Changes in Twitter MySQL 5. ...

  4. 从MySQL Bug#67718浅谈B+树索引的分裂优化

    从MySQL Bug#67718浅谈B+树索引的分裂优化 1月 6th, 2013 发表评论 | Trackback 问题背景 今天,看到Twitter的DBA团队发布了其最新的MySQL分支:Cha ...

  5. PostgreSQL B+树索引---分裂

    B+树索引-分裂 预备知识 <PostgreSQL B+树索引-查询> <PostgreSQL B+树索引-插入> 概述 现在,我们终于进入到了B+树索引最难的一个部分,节点的 ...

  6. 面试题:mysql 表删除一半数据,B+树索引文件会不会变小???

    今日寄语:努力的阶段,往往是最不养生的阶段! 一张千万级的数据表,删除了一半的数据,你觉得B+树索引文件会不会变小? (答案在文章中!!) 我们先来做个实验,看看表的大小是如何变化的?? 做个实验,让 ...

  7. mysql主键始终从小到大_Mysql从入门到入神之(四)B+树索引

    前言 文本已收录至个人GitHub仓库,欢迎Star:github.com/bin39232820- 种一棵树最好的时间是十年前,其次是如今 我知道不少人不玩qq了,可是怀旧一下,欢迎加入六脉神剑Ja ...

  8. b树与b+树的区别_一篇文章理清B树、B-树、B+树、B*树索引之间的区别与联系

    概述 相信对于B树.B-树.B+树.B*树索引这几个大家都很容易混淆,下面单独对这几个索引做下分类总结. B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结 ...

  9. 浅谈MySQL的B树索引与索引优化

    转载自   浅谈MySQL的B树索引与索引优化 MySQL的MyISAM.InnoDB引擎默认均使用B+树索引(查询时都显示为"BTREE"),本文讨论两个问题: 为什么MySQL ...

最新文章

  1. c#devexpress GridContorl添加进度条
  2. leetcode算法题--排序链表★
  3. Android实训日志:基于外部存储的音乐播放器V04
  4. 《.NET应用架构设计:原则、模式与实践》新书博客--试读-1.1.2 架构师的职责
  5. 数据结构与算法--二叉查找树实现原理
  6. 全志R40 UBOOT 2014.07【原创】
  7. 食物链(扩展域并查集)
  8. win10桌面背景为什么突然变黑了 win10桌面背景不显示解决方法
  9. 2009.01.19(山寨)
  10. 【VBA】提取 Word|PPT|Excel 批注实例(Excel一键导入办公文档中的批注)
  11. 回忆当年高考的一道数学证明题
  12. 阿里云账号如何个人实名?
  13. java purge_springboot之全局处理统一返回
  14. 取模运算性质_数学与编程——求余、取模运算及其性质 | 学步园
  15. [sig18]《使命召唤:二战》的材质光照技术
  16. STM32中断回调函数定时器-STM32电控学习笔记06
  17. html超级简单实现点赞(收藏)和取消赞效果
  18. Software Testing - 测试用例设计之如何提高测试覆盖率
  19. 先进先出或是先进后出算法
  20. 计算机组装时应该注意的硬件参数,深度解析组装一台计算机需要注意的兼容性问题...

热门文章

  1. 手串(暴力) - 今日头条2018校园招聘后端方向(9.10)
  2. 电脑保存的html打不开,有的网页你打不开,在别的电脑就能打开,这样处理就解决了...
  3. 映客为何会被宣亚国际所收购?
  4. 科学计算机怎么按年金计算,年金终值计算器:年金现值和终值的计算
  5. cisco Packet Tracer 用三层交换机实现综合组网
  6. scikit-learn : LARS
  7. Vue实战狗尾草博客管理系统第二章
  8. 掌门1对1融资3.5亿美元?暂未回应!教育江湖头部地位早已奠定
  9. 一、Shell 脚本
  10. PyTorch contiguous 的概念