大多数java后端开发者在公司会使用 mysql 数据库管理系统。我们都知道 mysql 中最常用的 InnoDB 存储引擎依赖于基于主键的 B+ 树存储数据。那么为什么不在 B+ 树叶子节点存储数据的 data 区增加一个隐藏计数器记录元素重复个数?
这个变化也使得表中去删除元素变得多样化,移除所有指定的元素直接 removeAll,即将指定子叶节点移除。而删除一个则是使 counter--。
没错,是基于主键。主键有什么特征?当然是唯一标识,即不可重复。那么增加这个计数还有意义嘛?当然是没有了。因为子叶节点以上的部分的索引值都是不可重复的。所以计数参数的值必然全是1。
隐藏计数器带来的变化
理论上加上这个计数参数对我们 B+ 的空间开支有非常大的节省,其避免了重复元素在根节点和子叶节点之间的空间的占用。同时在插入元素时也减少了分裂等平衡树的操作的开销,操作也只是使 counter++。这个变化也使得表中去删除元素变得多样化,移除所有指定的元素直接 removeAll,即将指定子叶节点移除。而删除一个则是使 counter--。
原因
后面经过思考,发现这么做是极蠢的。回想前面所提到的:mysql 中最常用的 InnoDB 存储引擎依赖于基于主键的 B+ 树存储数据。没错,是基于主键。主键有什么特征?当然是唯一标识,即不可重复。那么增加这个计数还有意义嘛?当然是没有了。因为子叶节点以上的部分的索引值都是不可重复的。所以计数参数的值必然全是1。