「SQL」拜托,别再问我什么是 B+ 树了( 四 )
本文插图
如果把 3604 这个身份证号插入到 3504 后面的话 , 这个节点的元素个数就有 3 个了 , 显然不符合二叉树的条件 , 此时就会造成页分裂 , 就需要调整这个节点以让它符合二叉树的条件 。
本文插图
如图示:调整过后符合二叉树条件
这种由于页分裂造成的调整必然导致性能的下降 , 尤其是以身份证作为主键的话 , 由于身份证的随机性 , 必然造成大量的随机结点中的插入 , 进而造成大量的页分裂 , 进而造成性能的急剧下降 , 那如果是以自增 id 作为主键呢 , 由于新插入的表中生成的 id 比索引中所有的值都大 , 所以它要么合到已存在的节点(元素个数未满)中 , 要么放入新建的节点中(如下图示)所以如果是以自增 id 作为主键 , 就不存在页分裂的问题了 , 推荐!
本文插图
有页分裂就必然有页合并 , 什么时候会发生页合并呢 , 当删除表记录的时候 , 索引也要删除 , 此时就有可能发生页合并 , 如图示:
本文插图
当我们删除 id 为 7 , 9 对应行的时候 , 上图中的索引就要更新 , 把 7 , 9 删掉 , 此时 8 , 10 就应该合到一个节点 , 不然 8 , 10 分散在两个节点上 , 可能造成两次 IO 读 , 势必会影响查找效率! 那什么时候会发生页合并呢 , 我们可以定个阈值 , 比如对于 N 叉树来说 , 当节点的个数小于 N/2 的时候就应该和附近的节点合并 , 不过需要注意的是合并后节点里的元素大小可能会超过 N , 造成页分裂 , 需要再对父节点等进行调整以让它满足 N 叉树的条件 。
本文插图
怎么根据索引查找行记录 相信大家看完以上的 B+ 树索引的介绍应该还有个疑惑 , 怎么根据对应的索引值查找行记录呢 , 其实相应的行记录就放在最后的叶子节点中 , 找到了索引值 , 也就找到了行记录 。 如图示:
本文插图
可以看到 , 非叶子节点只存了索引值 , 只在最后一行才存放了行记录 , 这样极大地减小了索引了大小 , 而且只要找到索引值就找到了行记录 , 也提升了效率 ,
这种在叶节点存放一整行记录的索引被称为聚簇索引 , 其他的就称为非聚簇索引 。
本文插图
关于 B+ 树的总结 综上所述 , B+树有以下特点:
- 每个节点中子节点的个数不能超过 N , 也不能小于 N/2(不然会造成页分裂或页合并)
- 根节点的子节点个数可以不超过 m/2 , 这是一个例外
- m 叉树只存储索引 , 并不真正存储数据 , 只有最后一行的叶子节点存储行数据 。
- 通过链表将叶子节点串联在一起 , 这样可以方便按区间查找
- 『暴力』【图说】别再让香港经济给“黑暴”买单!
- 军军说事真正的电网杀手!美大呼中国别再研制了,城市瞬间停电断网
- 机智的洗衣机别再给妈妈用你的旧手机了
- 互联热闻事外行人都不知道,华为和荣耀的巨大差距,别再买错了!
- #高校#家长别再被忽悠了,高校强基计划只认这五大学科竞赛!
- 电视剧■“秀才”放现代等于什么学历,本科生能考上吗?别再被电视剧骗了
- 「王健林」油价再破4元大关,如今水比油贵,别再说养不起车了
- 五一别再宅家了!京东电脑数码店劳动节欢庆活动重磅来袭!
- 蓝精灵说新科技苹果别再盲目选择:A13+128G+ 良心价,你考不考虑?
- 蓝精灵说新科技良心价,你考不考虑?,苹果别再盲目选择:A13+128G+