Hash Tables
这是 andy 最喜欢的一节课,也是我最喜欢的,因为比较简单,哈哈。 这节主要介绍 DBMS 的 Access Methods。主要解决如何从让 DBMS 快速的从 page 中读取数据。
Hash Tables
Hash Table 主要分为两部分:
Hash Function:
How to map a large key space into a smaller domain
Trade-off between being fast vs. collision rate
Hashing Scheme:
How to handle key collisions after hashing
Trade-off between allocating a large hash table vs. additional instructions to find/insert keys
Hash Function
这就不多言,里面的知识太深奥了,对于 DBMS 设计者而言使用 XXHash3 就行了。
Static Hash Scheme
Liner Probe Hashing
我们熟知的开放地址寻址法就是这个方法。具体的策略就不多言了。
当 hashing collision 时,我们指定一个方向,去找到一个空位,存放我们的 key-value。注意 liner probe hashing 必须同时 key-value,这样才能分辨,hashing collision。
当要删除时,有两个方法。
Tombstone:在删除的位置放个尸体,以便于当 hashing collision 时的查找。
Movement:这个方法不太行,我不是很看好。
当遇见相同 key 时, 两个办法。
Separate Linked List:Store values in separate storage area for each key.
Redundant Keys:Store duplicate keys entries together in the hash table.
Robin Hood Hashing & Cuckoo Hashing
这俩就不多说了,用的也少。
dynamic Hash Scheme
与静态哈希策略需要预测数据量大小的情况不同,动态哈希策略,自己去扩容。
Chained Hashing
这是我们熟知的开链法,不过这里不单单只是一个结点,而是开辟一个桶。不过容易退化为链表,而且并发性能不好。
Extendible Hashing
这个 lab2 里实现了,具体可以看看 lab2's blog。
Linear Hashing
维护一个指针指向我们要拆分的 bucket,每当 bucket 溢出时,只拆分指针指向的 bucket。这个用的挺多的,建议多了解一下。
最后更新于