【CMU 15-445/645 Database Systems】07 tree indexes-1

298 阅读3分钟

这是我参与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+树的数据值都存放在叶子节点上;内部节点只用来进行检索。

叶子节点的值放什么?

  • 存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+树。这种树的定义和一些特征应该都很熟悉了,网上也有很多资料,所以不加赘述;更重要的是,关注一下它用在索引中,有什么价值,有哪些细节需要注意,在设计的时候,有哪些参数需要考虑。