这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战
这一节介绍的是表的索引。DBMS确保表内容和表索引在逻辑上是同步的。我们可以在表中的部分属性上建立索引,执行query的时候,DBMS会找到最有效的索引。
There is a trade-off on the number of indexes to create per database.
1. B+Tree
b树就是平衡树(balance tree),数据库中用到的是B+树。
- 自平衡,每个节点包含的key数有约束。
- 维持数据有序。
- 以O(logn)的复杂度实现查找、顺序访问、插入、删除。
- b+会把所有的值都存放的叶子节点中。内部节点只用来作为检索路径。
- 对比b树,b+树的数据值都存放在叶子节点上;内部节点只用来进行检索。
- 一个b+树的可视化网站。
叶子节点的值放什么?
-
存ID:指向tuple存放的位置,相当于存的是地址
-
存tuple data:存放实际的数据内容。一般数据库中只有一个主索引(聚簇索引)将索引和数据一起存放,即叶子节点上存放的是具体数据;辅助索引只能存放数据id(主键)或者这条数据实际存放的地址。
- 存主键的好处:数据存储的位置有变化的时候,不需要修改索引;但是需要再去主索引中做一次查找。
- 存数据地址的好处:不需要在辅助索引中找到目标数据后再去主索引中查找数据;
插入和删除
网上很多资料,不展开。
2. Design choices
Node size
与硬件性能有关。性能越差每个节点就要越大一点。目标是,能把将一个节点中的数据从磁盘加载到内存的这个开销,分摊到尽可能多的键值对上。
Merge threshold
有些DBMS,在节点使用量达到一半的时候,还不会进行merge。延迟merge操作意味着减少merge次数,也就减少了整体reorganization的数量。
也可以放任不管,但定期的rebuild整个树结构(类似于,表中数据变化时,不去修改索引,而是直接重建索引这个思路?)。
Variable length keys
变长的key如何存储?
- Pointers
- Variable length node
- Padding
- Key map/ Indirection
Non-unique indexes
- Duplicate keys:将重复的key存储多次,因为value不同所以不会有歧义
- Value lists:每个key对应一个链表来存储多个value
Intra-node search
- linear:直接线性扫描
- Binary
- Interpolation
3. 总结
这一节介绍的是数据库中的索引使用的数据结构:B+树。这种树的定义和一些特征应该都很熟悉了,网上也有很多资料,所以不加赘述;更重要的是,关注一下它用在索引中,有什么价值,有哪些细节需要注意,在设计的时候,有哪些参数需要考虑。