为什么mysql B+树不在叶子节点存储数据的data区增加一个隐藏计数器记录元素重复个数?

大多数java后端开发者在公司会使用 mysql 数据库管理系统。我们都知道 mysql 中最常用的 InnoDB 存储引擎依赖于基于主键的 B+ 树存储数据。那么为什么不在 B+ 树叶子节点存储数据的 data 区增加一个隐藏计数器记录元素重复个数?

隐藏计数器带来的变化
理论上加上这个计数参数对我们 B+ 的空间开支有非常大的节省,其避免了重复元素在根节点和子叶节点之间的空间的占用。同时在插入元素时也减少了分裂等平衡树的操作的开销,操作也只是使 counter++。

这个变化也使得表中去删除元素变得多样化,移除所有指定的元素直接 removeAll,即将指定子叶节点移除。而删除一个则是使 counter--。

原因
后面经过思考,发现这么做是极蠢的。回想前面所提到的:mysql 中最常用的 InnoDB 存储引擎依赖于基于主键的 B+ 树存储数据。

没错,是基于主键。主键有什么特征?当然是唯一标识,即不可重复。那么增加这个计数还有意义嘛?当然是没有了。因为子叶节点以上的部分的索引值都是不可重复的。所以计数参数的值必然全是1。

延申
那么可能会问,非主键索引呢?非主键索引本身 data 区存储的数据就比主键索引少,所以需要去主键索引结构中二次查表,即回表。所以其自身重复元素计数并没有太大意义,因为它的占用的空间并不如主键索引结构大。那么计数对于这些非主键索引有意义嘛?很显然,对于唯一索引是没有意义的,理由和主键索引一样。对非唯一索引是可以使用的,但很显然,到此可以总结为弊大于利。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值