为什么Innodb用B+树而不用跳表

为什么Innodb用B+树而不用跳表

  • (1)Innodb出来时跳表还没发扬光大,所以没选跳表?
  • (2)B+树的一个节点可以存储很多关键字,而且单个节点大小可以与磁盘页对齐(默认16kb),一次IO就能传输一整个节点(跳跃表可能会出现跨页IO),大幅减少磁盘IO次数,所以B+树更适合用于文件系统及关系型数据库。
  • (3)跳跃表的索引层建立具有随机性,磁盘不能对链表进行预读,会产生大量随机IO。(磁盘预读:从本次被读取的位置开始,顺序向后读取一定长度的数据放入内存)
  • (4)B+树检索效率比跳表高。
### InnoDB 使用 B+ 的原因及优势 #### 1. 数据分布与磁盘 I/O 效率 B+ 的设计使得其能够有效地减少磁盘 I/O 操作次数。由于磁盘读写操作通常是以块为单位进行的,而 B+ 的高度较低且每个节点可以容纳较多的关键字子节点指针,因此在查询过程中所需的磁盘访问次数较少[^5]。 #### 2. 范围查询的支持能力 相比于红黑或其他类型的二叉搜索,B+ 更适合处理范围查询。这是因为所有的记录都存储在叶子节点上,并且这些叶子节点之间存在链表链接关系。这样,在执行范围查询时可以通过简单的线性扫描完成目标数据集定位而不必反复跳跃不同层次间的内部节点[^4]。 #### 3. 插入删除操作稳定性 当向一棵平衡二叉(如AVL或红黑)中频繁地插入新元素或者移除已有元素时可能会破坏原有结构从而引发复杂的旋转调整过程;然而对于B+来说,即使发生分裂合并等情况也仅限于局部范围内不会影响整体高度变化太多,进而保持较高的运行效率[^1]。 #### 4. 缓存友好型设计 考虑到计算机体系架构特点——CPU缓存行大小有限制等因素的影响,采用扁平化程度更高的B+有助于提高命中率并降低延迟成本。因为每次加载一页数据进入内存后往往能覆盖更多实际需要用到的信息项,所以相比起那些分支因子较小的传统BST变种而言更加节省资源消耗[^2]。 ```python class Node: def __init__(self, keys=None, children=None): self.keys = keys or [] self.children = children or [] def insert(node, key): if not node.children: # Leaf node index = find_insert_position(node.keys, key) node.keys.insert(index, key) return split_if_needed(node) child_index = find_child_position(node.keys, key) updated_child = insert(node.children[child_index], key) if isinstance(updated_child, tuple): # Split occurred new_key, new_child = updated_child index = find_insert_position(node.keys, new_key) node.keys.insert(index, new_key) node.children.insert(index + 1, new_child) return split_if_needed(node) return node def search(node, target): while True: i = bisect_left(node.keys, target) if i != len(node.keys) and node.keys[i] == target: break if not node.children: return None node = node.children[i] return (node, i) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值