Radix Tree在Hyper中的实现:解读Hyper论文《 The Adaptive Radix Tree: ARTful Indexing for Main-Memory Databases 》

本文深入解析Radix Tree(Trie)在数据库系统HyPer中的应用,介绍Adaptive Radix Tree (ART) 的设计理念,如Node4, Node16, Node48和Node256四种节点类型,及其如何有效减少空间浪费,提高内存数据库的索引性能。通过实例展示ART如何存储字符串和整数,以及动态扩容策略。" 100019145,493509,Hadoop大数据处理:Hive与Impala解析,"['大数据开发', 'Hadoop', 'Hive', 'Impala', '数据仓库']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有问题可以给我发邮件zhangtiey@gmail.com


本文讨论如何在实际的数据库系统中应用Radix Tree作为索引,暨解读HyPer的论文:The Adaptive Radix Tree:ARTful Indexing for Main-Memory Databases。本人和其作者Viktor有过一段时间的共事,希望对大家能有帮助。


Radix Tree实际上就是前缀树,也称之为Trie。相比B-Tree,其最大的特性是1)数的高度不随表的大小而增长,而是和key的长度有关;2)更新和删除不涉及到树结构的调整。但是因为常用方法往往造成空间上的浪费,所以Radix Tree并没有广泛应用在DBMS中。相比之下Linux的文件系统使用Radix Tree进行文件路径的索引,显而易见是因为前缀树的正好符合文件路径的特性。HyPer的这篇文章从实用的角度(发在ICDE也是这个原因)阐述了如何在实际的DBMS中实现Radix Tree。


其核心的思想是如何减少空间的浪费。让我们先举一个简单的例子,看看Radix Tree如何浪费空间的。如下图所示,我们有一颗Radix Tree,每个Node是一个vector<char>,里面的每个元素存了一个byte(实际系统中,byte是最好的方式)。如果我们要存储字符串,那么vecotr的大小是26。因此每个Node的大小是26 Bytes。假如我们有100个字符串要索引,但每个字符串只用到了a, b ,c , d,那么对于26 Bytes的空间,只用了4个Byte,剩下的全部浪费掉了。


ART设计了4中Node类型:Node4,Node16,Node48和Node256,这里数字的含义是包含了多少个元素。比如Node4只能存放4个元素,Node16存放16个元素,Node48存放48个元素,Node256存放256个元素。为什么最大的类型是存放256个元素呢?因为上面我们提到,vector中每个元素是一个Byte,即8 bit。那么表示的范围是0~255。也就是说我们不仅仅能存储字符串,也可以存储integer。比如存储一个整数5,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值