一个简单的问题:为什么数据库表不是使用数组或动态数组(例如,C ++中的向量)而是使用展开树(或B树)来实现的?
我的推理
Splay树将最后使用的数据聚集在一起,并且经常在最上面使用,这很好,但是此属性可能会导致O(n)情况,因此必须不时进行重新平衡(在查找操作中可以说)。重新平衡会部分破坏上面的属性,而重新平衡则会导致响应下降。 B树可能更经常是底层表示形式,但在某些特殊情况下仍会表现出log(n)和倾角,而没有提供数据聚类。
如果改为使用动态数组,则数据中的所有CRU都将为O(1),除了会不时调整内存大小(通过某种智能预分配,可能在不计算时移动等等),我认为呈现为零影响)。唯一的问题是删除,但是根据我的经验,大多数数据(如果表不是关系表或临时数据...)甚至都不会删除,只是无效,因为它们可以重用于分析。使用树表示法等,您将不得不将无效数据拆分到单独的表中以保持速度,以此类推,因为即使阵列也不重要,因为随着数据库的扩展操作成本不会改变。仅当将创建大量临时数据时,失效而不是删除才是问题。
因此,也许有可能选择我想要的数据库表的基础结构(实际上有可能)吗?当我们谈论数十亿个条目并考虑磁盘和跳转的速度时,log(n)与O(1)的区别就很大。
有什么收获?