掌桥专利:专业的专利平台
掌桥专利
首页

一种索引构建方法、数据读取方法及索引构建装置

文献发布时间:2023-06-19 18:37:28


一种索引构建方法、数据读取方法及索引构建装置

技术领域

本申请涉及数据存储领域,具体而言,涉及一种索引构建方法、数据读取方法及索引构建装置。

背景技术

前缀树:即Trie Tree,也叫字典树,是一种用于快速检索的多叉树结构。一个前缀树可以用来索引数值,字符串等多种数据类型(索引数值类型时也称为基数树,即Rad ixTree)。前缀树的每一个结点会有多个子结点,每个结点的所有子结点包含的字符都不相同。在前缀树中,每一个结点代表一个字符串(前缀),从根结点到某一结点,路径上经过的字符连接起来,为该结点对应的字符串。前缀树的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。

但是,前缀树模型的时间和空间效率都直接与数据量成负相关,大数据时代对存储系统提出了更高的容量和性能要求。

发明内容

有鉴于此,本申请的目的在于提供一种索引构建方法、数据读取方法及索引构建装置,构建的索引结构更为扁平,且在不同的数据集以及写密集型的工作负载中有更优的性能,同时在数据分布发生变化时性能保持稳定,尾延迟性能指标也更优。

本申请实施例提供的一种索引构建方法,包括:

将初始数据输入前缀树的第一目标节点,根据所述初始数据和所述第一目标节点的预设空间放大率阈值,确定出所述第一目标节点的目标前缀长度;

根据第一目标节点的目标前缀长度,将所述初始数据划分为多个子数据集,和/或从初始数据中筛选出存储在所述第一目标节点的待存储数据;其中,所述子数据集中的初始数据具有相同的节点前缀;

根据节点前缀和/或待存储数据确定出第一目标节点的索引模型,并通过所述索引模型分别计算每一子数据集的节点前缀对应的指向子节点的指针以及存储位置,和/或分别计算每一待存储数据的存储位置;

将每一节点前缀和指向子节点的指针、和/或每一待存储数据存储在对应的存储位置,构建出所述第一目标节点的索引结构;

将构建好的第一目标节点的子节点作为新的第一目标节点,将子节点对应子数据集作为新的初始数据,构建所述新的第一目标节点的索引结构,直至满足构建完成条件,构建出整个索引。

在一些实施例中,所述的索引构建方法中,根据所述初始数据和所述第一目标节点的预设空间放大率阈值,确定出所述第一目标节点的目标前缀长度,包括:

根据所述初始数据的数据分布特征确定出至少一个待验证前缀长度;

分别计算每一个待验证的前缀长度对应的空间放大率;

筛选出对应的空间放大率不大于第一目标节点的预设空间放大率阈值的待验证前缀长度;

确定筛选出的最大的待验证前缀长度作为目标前缀长度。

在一些实施例中,所述的索引构建方法中,根据节点前缀和/或待存储数据确定出第一目标节点的索引模型,包括:

根据节点前缀和/或待存储数据,计算出满足预设空间放大率阈值的目标全局斜率;

根据计算出的目标全局斜率,确定一线性模型作为索引模型。

在一些实施例中,所述的索引构建方法中,在构建出整个索引之后,所述方法还包括:

在构建好的索引中插入新的数据时,判断新的数据映射的第二目标节点的目标槽位是否满足预设调整条件;

若是,则根据包括所述新的数据的第二目标节点的数据,通过预先配置的调整策略调整所述第二目标节点的索引结构。

在一些实施例中,所述的索引构建方法中,所述根据包括所述新的数据的第二目标节点的数据,调整所述第二目标节点的索引结构,包括:

调整所述第二目标节点的空间放大率,以扩大第二目标节点的存储空间;

或者,根据包括所述新的数据的第二目标节点的数据,重新确定第二目标节点的索引模型;

或者,将第二目标节点的数据槽位的键值对、指针槽位的节点前缀和指针组成的键值对作为第二目标节点的初始数据;

根据所述第二目标节点的初始数据和预设空间放大率阈值,重新确定出所述第二目标节点的目标前缀长度和索引模型,以重新构建第二目标节点的索引结构。

在一些实施例中,所述的索引构建方法中的所述预设调整条件至少为以下之一:第二目标节点的满载率到达预设满载率阈值;新的数据映射的第二目标节点的目标槽位为数据槽位;新的数据映射的第二目标节点的目标槽位为指针槽位,且新的数据与指针槽位指向的子节点的最长公共前缀不匹配。

在一些实施例中,所述的索引构建方法中,当第一目标节点的子节点与第一目标节点的节点前缀之差小于预设长度阈值时,第一目标节点的子节点采用ART结点。

在一些实施例中,还提供一种数据读取方法,应用于通过所述索引构建方法构建的索引;所述读取方法包括:

从索引的根节点出发,判断当前节点的节点前缀与待读取数据是否匹配;

若匹配,则通过当前节点中的索引模型,计算所述待读取数据的目标槽位;

若所述目标槽位为数据槽位,则判断所述数据槽位中的数据与待读取数据是否匹配,若匹配则返回所述数据槽位中的数据;

若所述目标槽位为指针槽位,则在所述指针槽位指向的子节点中查询所述待读取数据,直至返回读取结果。

在一些实施例中,所述数据读取方法还包括:

针对待读取的数据范围,确定出所述数据范围的边界数据;其中,所述边界数据为所述数据范围内最大的数据和/或最小的数据;

在索引中确定出所述边界数据的存储位置;

并根据索引中数据的存储顺序和所述边界数据的存储位置,返回匹配所述待读取的数据范围的读取结果。

在一些实施例中,还提供一种索引构建装置,包括:

确定模块,用于将初始数据输入前缀树的第一目标节点,根据所述初始数据和所述第一目标节点的预设空间放大率阈值,确定出所述第一目标节点的目标前缀长度;

划分模块,用于根据第一目标节点的目标前缀长度,将所述初始数据划分为多个子数据集,和/或从初始数据中筛选出存储在所述第一目标节点的待存储数据;其中,所述子数据集中的初始数据具有相同的节点前缀;

计算模块,用于根据节点前缀和/或待存储数据确定出第一目标节点的索引模型,并通过所述索引模型分别计算每一子数据集的节点前缀对应的指向子节点的指针以及存储位置,和/或分别计算每一待存储数据的存储位置;

第一构建模块,用于将每一节点前缀和指向子节点的指针、和/或每一待存储数据存储在对应的存储位置中,构建出所述第一目标节点的索引结构;

第二构建模块,用于将构建好的第一目标节点的子节点作为新的第一目标节点,将子节点对应子数据集作为新的初始数据,构建所述新的第一目标节点的索引结构,直至满足构建完成条件,构建出整个索引。

本申请实施例提出一种索引构建方法、数据读取方法及索引构建装置,在所述索引构建方法中,将初始数据输入前缀树的第一目标节点,根据所述初始数据和所述第一目标节点的预设空间放大率阈值,确定出所述第一目标节点的目标前缀长度和索引模型;根据第一目标节点的目标前缀长度,将所述初始数据划分为多个子数据集,和/或从初始数据中筛选出存储在所述第一目标节点的待存储数据;根据所述索引模型,分别计算每一子数据集的节点前缀对应的指向子节点的指针以及存储位置,和/或分别计算每一待存储数据的存储位置;将每一节点前缀和指向子节点的指针、和/或每一待存储数据存储在对应的存储位置,构建出所述第一目标节点的索引结构;构建第一目标节点的子节点作为新的第一目标节点,将子节点对应子数据集作为新的初始数据,构建所述新的第一目标节点的索引结构,直至满足构建完成条件,构建出整个索引,也就是说,相比于传统索引结构,本申请实施例所构建的索引中,每个节点中有一与该节点的数据匹配的学习索引模型,具有学习型索引拟合数据分布的能力,从而能够在基础的查询性能上比传统索引具有全面的优势;同时相比其他学习索引也有相应的竞争力,对其他学习型索引而言,构建的索引具有与传统的前缀树索引(例如ART)的整体鲁棒性,能够在不同的数据集,以及写密集型的工作负载中有更优的性能,同时在数据分布发生变化时性能保持稳定,尾延迟性能指标也更优;本申请实施例所述索引构造算法不仅时间复杂度低,而且能够保证整棵树的扁平化结构,同时能够为插入调整策略所需要的不同前缀映射到不同位置的性质。

附图说明

为了更清楚地说明本申请实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本申请的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。

图1示出了本申请实施例所述索引构建方法的方法流程图;

图2示出了本申请所构建的前缀树索引结构示意图;

图3示出了本申请实施例所述确定出所述第一目标节点的目标前缀长度的方法流程图;

图4示出了本申请实施例所述根据节点前缀和/或待存储数据确定出第一目标节点的索引模型的方法流程图;

图5示出了本申请实施例所述调整所述第二目标节点的索引结构的方法流程图;

图6示出了本申请实施例所述数据读取方法的方法流程图;

图7示出了本申请实施例所述数据读取方法的方法流程图;

图8示出了本申请实施例所述索引构建装置的结构示意图;

图9示出了本申请实施例所述电子设备的结构示意图。

具体实施方式

为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,应当理解,本申请中附图仅起到说明和描述的目的,并不用于限定本申请的保护范围。另外,应当理解,示意性的附图并未按实物比例绘制。本申请中使用的流程图示出了根据本申请的一些实施例实现的操作。应该理解,流程图的操作可以不按顺序实现,没有逻辑的上下文关系的步骤可以反转顺序或者同时实施。此外,本领域技术人员在本申请内容的指引下,可以向流程图添加一个或多个其他操作,也可以从流程图中移除一个或多个操作。

另外,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本申请实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本申请的实施例的详细描述并非旨在限制要求保护的本申请的范围,而是仅仅表示本申请的选定实施例。基于本申请的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。

需要说明的是,本申请实施例中将会用到术语“包括”,用于指出其后所声明的特征的存在,但并不排除增加其它的特征。

数据库索引:即Database Index,是用于加速访问数据操作的一种数据结构。通过在存储数据时额外将数据标识符(或数据的键,即Key),以及数据实际存储位置(或数据的值,即Value)存储在索引结构中。虽然创建索引结构并维护需要额外的空间代价,但索引可以加速后续对数据元素的访问,避免了直接扫描数据元素查询的高昂代价。访问数据的操作可以先通过数据标识符(Key)输入到索引中查询然后得到数据的实际存储位置(Value)。此外,索引这类数据结构也被广泛应用在其他领域,如键值存储,文件系统,搜索引擎等等。

有序索引:即Sorted Index,是众多索引结构中的一类索引,最突出的特点就是其除了支持点查询外,还支持高效的范围查询,前缀查询等。这主要是通过显式地按数据元素的顺序来组织索引结构实现的。点查询即根据数据标识符(Key)查询数据元素的存在性,如果该数据元素存在则返回数据的实际存储位置(Value)。范围查询则是给定一个数据标识符(Key)的范围,返回该范围内所有数据元素的实际存储位置(Value)。前缀查询即给定一个数据标识符(Key),返回所有数据元素中小于该数据标识符(Key)的最大值,以及其对应的数据存储位置(Value)。其他类别的索引结构如哈希索引则只支持点查询,无法支持高效的范围查询或前缀查询。

前缀树:即Trie Tree,也叫字典树,是一种用于快速检索的多叉树结构。一个前缀树可以用来索引数值,字符串等多种数据类型(索引数值类型时也称为基数树,即RadixTree)。前缀树的每一个结点会有多个子结点,每个结点的所有子结点包含的字符都不相同。在前缀树中,每一个结点代表一个字符串(前缀),从根结点到某一结点,路径上经过的字符连接起来,为该结点对应的字符串。前缀树的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。

但是,前缀树模型的时间和空间效率都直接与数据量成负相关,大数据时代对存储系统提出了更高的容量和性能要求。

现有技术中也对传统的前缀树模型进行了各种改进,以提高前缀树模型的容量和性能。例如,提出了自适应基数树Adaptive Radix Tree(ART),即为了解决基数树在最坏情况下空间消耗过多的问题,ART自适应地为内部结点选择紧凑高效的数据结构,同时使用延迟展开和路径压缩的方式来降低树的高度,因此ART具有更高的空间效率。ART索引内部每层通过8Bit来记录并区分键值的部分前缀,根据每个结点的数据量来决定结点类型,有Node4,Node16,Node48,Node256四种类型,每种类型都通过诸如SIMD并行指令,间接索引等方式保证高效访问。它的查找性能超过了高度调优的只读搜索树,同时还支持非常高效的插入和删除。在性能与哈希表相当的同时,ART还以排序的顺序维护数据,从而可以支持诸如范围扫描和前缀查找等哈希表无法支持的操作。不仅如此,由于ART的插入操作最多只需要修改父结点以及当前结点两个结点,所以其对多线程并行更为友好,能够在插入操作时较小地阻塞其他并行操作的执行。

以及在公开号为CN112732725A的专利中,记载了基于NVM混合内存的自适应前缀树构建方法及其系统、介质;为了降低前缀树索引结构对DRAM的空间消耗,同时还能维持较高的性能,该方案提供了一种基于NVM混合内存的自适应前缀树构建方法,构建全局索引数据结构对全量数据和结点在NVM地址空间进行构建和维护;在DRAM地址空间中维护对新增数据和结点的快捷索引数据结构,减少NVM地址空间的的引入对索引性能的影响。当DRAM地址空间占用达到设定比例后,触发迁移线程将新增数据和结点迁移到NVM地址空间中,能够有效降低索引结构对DRAM的空间占用,降低存储成本,并高效实现各种数据库操作请求。

学习型索引:即Learned Index,是一类新型的利用机器学习方法和思路构建的索引结构。学习型索引将索引结构本身视作是将数据标识符(Key)作为输入,以其对应存储在索引结构中的位置信息作为输出的一个模型。在这种视角下,可以利用各类机器学习模型来替代或加速索引模型的检索,通过直接拟合输入输出的函数关系,进而通过计算模型结合一些修正即可搜索到数据。通过更快更简单的模型计算操作,替换传统索引中初步的顺序查找,二分查找等查找操作,从而加快整体查询效率。在实际执行查询时,学习型索引将输入通过模型预测得到在当前索引结点中的位置,若模型存在误差则需要额外的查找修正,通过多层模型的查找后最终得到输出。

虽然学习型索引能在大部分数据集以及工作负载下取得比传统索引更优秀的性能,然而在面临难以学习的数据集,以及写密集型的工作负载时,学习型索引的性能则不如传统索引,例如自适应基数树ART的性能。并且在数据分布变动比较大时,性能会有所波动,在不同工作负载的尾延迟也不如传统索引稳定。整体来说,学习型索引的鲁棒性不如传统索引。另外,目前学习型索引主要针对固定长度的数值型数据优化,无法处理变长的字符型数据,其功能的完善程度也不如传统索引。

本发明针对学习型索引的鲁棒性问题,以及传统索引的性能问题,提出了一种新型的索引结构,通过在传统的前缀树基础上引入学习模型,使得其兼具传统索引的鲁棒性,以及学习型索引的高效查询性能的特点,拥有处理变长字符型数据的能力,能够在各个方面稳定优于传统索引。

基于此,为了提升索引的性能和容量,本申请实施例提出一种索引构建方法、数据读取方法及索引构建装置,在所述索引构建方法中,将初始数据输入前缀树的第一目标节点,根据所述初始数据和所述第一目标节点的预设空间放大率阈值,确定出所述第一目标节点的目标前缀长度和索引模型;根据第一目标节点的目标前缀长度,将所述初始数据划分为多个子数据集,和/或从初始数据中筛选出存储在所述第一目标节点的待存储数据;根据所述索引模型,分别计算每一子数据集的节点前缀对应的指向子节点的指针以及存储位置,和/或分别计算每一待存储数据的存储位置;将每一节点前缀和指向子节点的指针、和/或每一待存储数据存储在对应的存储位置,构建出所述第一目标节点的索引结构;构建第一目标节点的子节点作为新的第一目标节点,将子节点对应子数据集作为新的初始数据,构建所述新的第一目标节点的索引结构,直至满足构建完成条件,构建出整个索引,也就是说,相比于传统索引结构,本申请实施例所构建的索引中,每个节点中有一与该节点的数据匹配的学习索引模型,具有学习型索引拟合数据分布的能力,从而能够在基础的查询性能上比传统索引具有全面的优势;同时相比其他学习索引也有相应的竞争力,对其他学习型索引而言,构建的索引具有与传统的前缀树索引(例如ART)的整体鲁棒性,能够在不同的数据集,以及写密集型的工作负载中有更优的性能,同时在数据分布发生变化时性能保持稳定,尾延迟性能指标也更优;本申请实施例所述索引构造算法不仅时间复杂度低,而且能够保证整棵树的扁平化结构,同时能够为插入调整策略所需要的不同前缀映射到不同位置的性质。

请参照图1,图1示出了本申请实施例所述索引构建方法的方法流程图;具体的,所述索引构建方法包括以下步骤S101-S105:

S101、将初始数据输入前缀树的第一目标节点,根据所述初始数据和所述第一目标节点的预设空间放大率阈值,确定出所述第一目标节点的目标前缀长度;

S102、根据第一目标节点的目标前缀长度,将所述初始数据划分为多个子数据集,和/或从初始数据中筛选出存储在所述第一目标节点的待存储数据;其中,所述子数据集中的初始数据具有相同的节点前缀;

S103、根据节点前缀和/或待存储数据确定出第一目标节点的索引模型,并通过所述索引模型分别计算每一子数据集的节点前缀对应的指向子节点的指针以及存储位置,和/或分别计算每一待存储数据的存储位置;

S104、将每一节点前缀和指向子节点的指针、和/或每一待存储数据存储在对应的存储位置,构建出所述第一目标节点的索引结构;

S105、将构建好的第一目标节点的子节点作为新的第一目标节点,将子节点对应子数据集作为新的初始数据,构建所述新的第一目标节点的索引结构,直至满足构建完成条件,构建出整个索引。

本申请实施例所述的索引构建方法构建的索引,相比于传统索引结构,本申请实施例所构建的索引中,每个节点中有一与该节点的数据匹配的学习索引模型,具有学习型索引拟合数据分布的能力,从而能够在基础的查询性能上比传统索引具有全面的优势;同时相比其他学习索引也有相应的竞争力,对其他学习型索引而言,构建的索引具有与传统的前缀树索引(例如ART)的整体鲁棒性,能够在不同的数据集,以及写密集型的工作负载中有更优的性能,同时在数据分布发生变化时性能保持稳定,尾延迟性能指标也更优;本申请实施例所述索引构造算法不仅时间复杂度低,而且能够保证整棵树的扁平化结构,同时能够为插入调整策略所需要的不同前缀映射到不同位置的性质。

在所述步骤S101中,将初始数据输入前缀树的第一目标节点,根据所述初始数据和所述第一目标节点的预设空间放大率阈值,确定出所述第一目标节点的目标前缀长度和索引模型。

请参照图2,图2示出了本申请所构建的前缀树索引结构示意图;所述前缀树索引中包括根节点,根节点作为父节点,有多个子节点,依次类推。

所述第一目标节点可以为根节点,或者其他节点;也就是说,第一目标节点为当下正在构建的节点,不特指根节点。当所述第一目标节点为根节点时,所述初始数据为用于构建索引的全部数据;当所述第一目标节点为其他节点时,所述输入到第一目标节点的初始数据,为父节点指向第一目标节点的指针对应的子数据集。

每个结点记录插入到以当前结点为子树的数据的最长公共前缀(Prefix),同时每个结点都有一个索引模型(model),以及输入到索引模型前需要预处理取出的键的节点前缀(span)。每个节点有一个数组用以存储指向子结点的指针以及数据,用两个bit位分别区分空的槽位、装有指向子结点指针的指针槽位,和装有数据的数据槽位。

请参照图3,根据所述初始数据和所述第一目标节点的预设空间放大率阈值,确定出所述第一目标节点的目标前缀长度,包括以下步骤S301-S304;

S301、根据所述初始数据的数据分布特征确定出至少一个待验证前缀长度;

S302、分别计算每一个待验证的前缀长度对应的空间放大率;

S303、筛选出对应的空间放大率不大于第一目标节点的预设空间放大率阈值的待验证前缀长度;

S304、确定筛选出的最大的待验证前缀长度作为目标前缀长度。

以及,在确定出第一目标节点的最大前缀长度后,根据确定出的最大前缀长度确定第一目标节点的索引模型。

请参照图4,所述的索引构建方法中,根据节点前缀和/或待存储数据确定出第一目标节点的索引模型,包括以下步骤S401-S402;

S401、根据节点前缀和/或待存储数据,计算出满足预设空间放大率阈值的目标全局斜率;

S402、根据计算出的目标全局斜率,确定一线性模型作为索引模型。

对于学习型索引来说,确定索引模型的构造算法是核心,目前主流的针对不同的优化目标有多种选择,例如基于最小二乘法的线性回归模型,基于最小化最大冲突率的FMCD方法。

本申请实施例提出了一种新的索引模型构造算法,以在取相同前缀长度(记为span)的前提下,相同子结点分段的数据拥有相同前缀,同时存储在子节点中不同位置的数据拥有不同的前缀,以此为目标提出了一种新型的构造算法。本申请实施例所述索引模型构造算法的优化设计目标是用尽可能大的前缀长度span,以降低前缀树的高度,构建的索引更为扁平化,同时令不同的前缀不发生冲突,落到该节点不同的位置。

确定尽可能大的前缀长度的方法如上述步骤S301-S304所述。

在一些实施例中,所述步骤S301-S304所述的确定出所述第一目标节点的目标前缀长度的方法中,所述根据所述初始数据的数据分布特征确定出至少一个待验证前缀长度,可以根据所述初始数据的字符长度确定,从大到小依次进行验证;例如所述初始数据中最短的数据的字符长度为5,则确定最大的待验证前缀长度为5,然后计算确定的待验证前缀长度5对应的空间放大率,若该待验证前缀长度5对应的空间放大率小于或等于预设空间放大率阈值,则确定5为目标前缀长度;若待验证前缀长度5对应的空间放大率大于预设空间放大率阈值,则验证待验证前缀长度4对应的空间放大率是否小于或等于预设空间放大率阈值,直至筛选出的尽可能大的待验证前缀长度作为目标前缀长度。

这里,空间放大率决定了第一目标节点的存储空间,或者说第一节点的槽位数目。若前缀长度对应的空间放大率大于预设空间放大率阈值,则说明存储初始数据中的数据或节点前缀所需的槽位数是不够用的,那么就需要降低前缀长度,减少初始数据划分出的子数据集或数据段的个数,从而保证不同的节点前缀不发生冲突,落到该节点不同的位置。

确定出所述第一目标节点的目标前缀长度后,即根据所述目标前缀长度和初始数据,计算出满足预设空间放大率阈值的目标全局斜率。

具体的,根据所述目标前缀长度和初始数据,计算出满足预设空间放大率阈值的目标全局斜率,包括:

根据所述目标前缀长度和初始数据,确定出初始数据中直接储存在第一目标节点的待存储数据,以及第一目标节点的节点前缀;

根据待存储数据和节点前缀,计算出满足预设空间放大率阈值的目标全局斜率。

这里,将节点前缀也作为数据,从而根据待存储数据和节点前缀,计算出满足预设空间放大率阈值的目标全局斜率,例如通过最小二乘法确定目标全局斜率。

本申请实施例中,还提供另一种确定第一目标节点中索引模型的方法。

这里,确定第一目标节点的索引模型需要遍历两趟初始数据,其时间复杂度是O(N+log

第一趟遍历确定目标前缀长度span的大小,第二趟遍历确定索引模型;具体过程如下:第一次遍历时,span初始化为0,然后根据初始数据中相邻两个数据X

在所述步骤S102中,根据第一目标节点的目标前缀长度,将所述初始数据划分为多个子数据集,和/或从初始数据中筛选出存储在所述第一目标节点的待存储数据;其中,所述子数据集中的初始数据具有相同的节点前缀。

这里,将所述初始数据划分为多个子数据集,子数据集中的数据是比较相似的,需要存储到第一目标节点的子节点中,第一目标节点中仅仅存储子数据集中数据的公共节点前缀。

同时,初始数据中可能有些数据直接存储在第一目标节点中。

因此,根据第一目标节点的目标前缀长度,将所述初始数据划分为多个子数据集,和/或从初始数据中筛选出存储在所述第一目标节点的待存储数据,有三种情况:第一种情况,根据第一目标节点的目标前缀长度,将所述初始数据划分为多个子数据集,例如,根节点通常不会直接存储数据,只存储子数据集的公共前缀;第二种情况,根据第一目标节点的目标前缀长度,将所述初始数据划分为多个子数据集,且将子数据集之外的数据作为待存储数据,一些比较靠后的子节点通常会同时存储数据以及子数据集的公共前缀;第三种情况,最低一层的子节点中,仅仅存储数据,不再存在子节点,也就不再存储公共前缀。

将所述初始数据划分为多个子数据集,所述子数据集中的初始数据具有相同的节点前缀,也就具有相同的最长公共前缀。

示例性的,初始数据包括absent、abnormal、append、apposition、bicycle、bigamy,可划分为三个子数据集,分别为absent、abnormal;append、apposition;bicycle、bigamy。

absent、abnormal的节点前缀为ab;append、apposition的节点前缀为ap;bicycle、bigamy的节点前缀为bi。

若初始数据包括absent、abnormal、append、apposition、bicycle、bigamy、name,则除了absent、abnormal;append、apposition;bicycle、bigam三个子数据集外,还包括要存储在第一目标节点的数据name。

需要说明的是,根据第一目标节点的目标前缀长度,将所述初始数据划分为多个子数据集,和/或从初始数据中筛选出存储在所述第一目标节点的待存储数据,包括:

根据第一目标节点的目标前缀长度,确定出节点前缀;

根据所述确定出的节点前缀,将所述初始数据划分为多个子数据集,和/或从初始数据中筛选出存储在所述第一目标节点的待存储数据。

例如,确定出所述第一目标节点的目标前缀长度为2,则可确定初始数据的节点前缀分别为:ab、ap、bi,然后划分出absent、abnormal;append、apposition;bicycle、bigam三个子数据集。

在所述步骤S103中,根据节点前缀和/或待存储数据确定出第一目标节点的索引模型,并通过所述索引模型分别计算每一子数据集的节点前缀对应的指向子节点的指针以及存储位置,和/或分别计算每一待存储数据的存储位置。

这里,根据节点前缀和/或待存储数据确定出第一目标节点的索引模型,可以根据所述节点前缀和/或待存储数据,计算线性模型的斜率,即可得到索引模型。

通过所述索引模型分别计算每一子数据集的节点前缀对应的指向子节点的指针以及存储位置,和/或分别计算每一待存储数据的存储位置;也就是说,针对子数据集,确定出节点前缀在第一目标节点中的槽位;针对待存储数据,确定出待存储数据在第一目标节点中的槽位。

在所述步骤S104中,将每一节点前缀和指向子节点的指针、和/或每一待存储数据存储在对应的存储位置,构建出所述第一目标节点的索引结构。也就是说,将每一节点前缀和指向子节点的指针存储在第一目标节点中的槽位中,以及,将每一待存储数据存储在第一目标节点中的槽位中,第一目标节点即构建完成。

在所述步骤S105中,将构建好的第一目标节点的子节点作为新的第一目标节点,将子节点对应子数据集作为新的初始数据,构建所述新的第一目标节点的索引结构,直至满足构建完成条件,构建出整个索引。

也就是说,在构建好第一目标节点后,需要将第一目标节点中的子数据集中的数据存储在第一目标节点的子节点中。其中,一个子数据集,对应一个字节点。

通过步骤S101-S104所述构建子节点,构建完子节点后,将该子节点作为父节点,直至满足构建完成条件,构建出整个索引。

所述构建完成条件为:用于构建索引的全部数据都存储在节点中。或者,第一目标节点的初始数据不存在子数据集。

在一些实施例中,在构建子节点时,当第一目标节点的子节点与第一目标节点的节点前缀之差小于预设长度阈值时,第一目标节点的子节点采用ART结点。

具体的,如果子结点与父结点的SPAN之差(即该结点实际用于区分键所真实使用的比特数)小于等于8,那么可以将结点替换成一个ART结点,实际替换后与除了查询该结点的查询策略略有不同,其余操作均相同,即本索引结构也可以兼容其他前缀树的索引结构调整设计。

为保证模型能够将输入的值没有误差地精确定向到对应的位置(精确映射),需要在插入新数据时执行系列调整操作。插入调整策略不仅能够保证精确映射的性质,还能够保持整棵树的结构尽可能扁平化,减小树高,通过优化树的结构以提升整体的查询性能。然而优化树结构的调整操作通常需要修改大量结点,延迟较高;另一方面择时进行调整操作又要求在插入过程中记录相应元信息,以控制插入调整的频率,减少频繁的调整带来的性能损失,然而一次插入需要修改多个元信息(诸如插入到整棵子树的元素数量)导致的更新开销在多线程并发时会产生争用从而影响可拓展性。综上,一个低延迟尤其是低尾延迟,强鲁棒,并发友好,同时高效的插入调整策略,对于可更新的学习型索引来说至关重要。

基于此,在构建出整个索引之后,所述索引构建方法还包括:

在构建好的索引中插入新的数据时,判断新的数据映射的第二目标节点的目标槽位是否满足预设调整条件;

若是,则根据包括所述新的数据的第二目标节点的数据,通过预先配置的调整策略调整所述第二目标节点的索引结构。

这里,所述预设调整条件至少为以下之一:第二目标节点的满载率到达预设满载率阈值;新的数据映射的第二目标节点的目标槽位为数据槽位;新的数据映射的第二目标节点的目标槽位为指针槽位,且新的数据与指针槽位指向的子节点的最长公共前缀不匹配。

根据包括所述新的数据的第二目标节点的数据,调整所述第二目标节点的索引结构,包括:

调整所述第二目标节点的空间放大率,以扩大第二目标节点的存储空间;

或者,根据包括所述新的数据的第二目标节点的数据,重新确定第二目标节点的索引模型;

或者,将第二目标节点的数据槽位的键值对、指针槽位的节点前缀和指针组成的键值对作为第二目标节点的初始数据;

根据所述第二目标节点的初始数据和预设空间放大率阈值,重新确定出所述第二目标节点的目标前缀长度和索引模型,以重新构建第二目标节点的索引结构。

这里,第一目标节点是构建索引时的任一节点,不特指根节点。第二目标节点为更新索引的节点结构时的节点,也可以是任一节点,一般为子节点。第一目标节点和第二目标节点仅仅为命名上的区别,不代表二者之间有父子关系。

请参照图5,图5示出了本申请实施例所述调整所述第二目标节点的索引结构的方法流程图。

本申请实施例中,所述索引模型也可以称之为前缀树,因此,索引模型中定位数据的位置,也可以简称为在树中定位。

插入新的数据时,需要通过每一级节点中的索引模型逐级往下,确定新的数据的目标槽位,会遇到三种情况:

第一种情况即被索引模型映射到空槽位的情况,这种情况可以直接占用该空槽位完成插入即可,此时若满足预设调整条件,会触发竖直扩展的调整策略。

第二种情况即被索引模型映射到数据槽位的情况,这种情况满足预设调整条件,需要将该槽位的数据与新插入数据一起建一个新的子结点容纳,然后将新子结点置于原槽位,倘若新子结点的最长公共前缀的长度比其父结点的SPAN更小且小于一个阈值T,则会触发父结点的调整策略。

第三种情况即被索引模型映射到指向子结点的指针槽位,但新插入值与该子结点最长公共前缀不匹配,满足预设调整条件,这种情况首先需要计算新插入值和该子结点记录的最长公共前缀之间新的最长公共前缀,然后看这个新的最长公共前缀的长度与其父结点的SPAN比较,如果比其父结点的SPAN更小且小于一个阈值T,那么就触发父结点的调整策略。否则仍然可以将插入值插入到该子结点(递归执行插入流程),同时更新该子结点记录的最长公共前缀。

这里,调整策略的核心思路是可以将子结点的最长公共前缀视作一个新的数据键,同时将指向该子结点的指针视作一个新的数据值,从而可以在尽可能少修改子结点的情况下,调整当前结点。当新插入的数据与已经存储的数据冲突时,触发冲突调整策略,整个冲突调整策略分为三步,在尽可能不修改模型的情况下逐步尝试:

第一步调整所述第二目标节点的空间放大率,以扩大第二目标节点的存储空间,也就是先试图通过调整空间大小的方式容纳新插入的冲突值。这种情况只会发生在两端之外插入数据的时候,通过调整空间大小试图容纳冲突值,如果能在给定的空间放大率下容纳新插入的冲突值,则调整完成;如果不行则尝试第二步。

第二步是试图通过调整线性模型的方式来容纳新插入的冲突值。具体计算流程和构造算法相似,需要看新插入的冲突值以及原槽位的最长公共前缀或者原槽位数据的键,计算一个新的斜率,然后看在新斜率给出的线性模型的基础上,如果能在给定的放大率下容纳改变映射后的所有结点,则调整完成,否则尝试第三步。

第三步,进行需要调整的第二目标结点SPAN的结点局部重建;这一步会扫描原结点的所有数据槽位的键值对;以及将所有指针槽位以最长公共前缀为键,指向子结点的指针为值的形式视作键值对。同时,新插入的冲突数据如果冲突槽位是子结点,那么还需要将该子结点的槽位以上述形式也扫描出来作为键值对,按顺序扫描之后的键值对已经是对于键有序的,不需要进一步排序。然后根据这些新的键值对用索引构建算法来构建一棵新的子树,即可将这棵新子树插入到原结点的位置。

此外,除了上述因为新插入值的冲突而引发的冲突调整策略之外,还会根据结点的满载率来进行竖直方向的扩展的竖直调整策略;即当一个结点的空槽位大部分已经被占满,同时该结点的总槽位数已经接近该结点SPAN所能允许的最大大小(即2^SPAN)时,就会竖直扩展该结点,以增大其SPAN,从而达到竖直方向合并,减少树层高,保证树结构扁平化的效果。竖直扩展的过程和冲突调整的第三步类似,需要扫描该结点的所有槽位,以及其子结点的所有槽位形成键值对,然后再据此按索引构建算法重建。这个竖直扩展的调整策略一般在插入到空槽位时检验条件触发,以减少尾延迟。

相比于传统索引结构,本申请实施例中构建的索引具有学习型索引拟合数据分布的能力,从而能够在基础的查询性能上比传统索引具有全面的优势,同时相比其他学习索引也有相应的竞争力;针对其他学习型索引而言,具有与传统的前缀树索引(例如ART)的整体鲁棒性,能够在不同的数据集,以及写密集型的工作负载中有更优的性能,同时在数据分布发生变化时性能保持稳定,尾延迟性能指标也更优。

本申请实施例提出的索引构造算法,不仅时间复杂度低,而且能够保证整棵树的扁平化结构,同时具有满足插入调整策略的性质;为解决可更新的学习型索引持续插入的同时能够保证高性能的问题,本申请实施例还提出了一种新型的插入调整策略,该调整策略具有低尾延迟,高鲁棒性,并发友好以及能够维护索引高效结构的性质。

此外,本发明技术还能够高效支持变长数据类型,以及字符型数据。

请参照图6,在一些实施例中,还提供一种数据读取方法,应用于本申请实施例所述索引构建方法构建的索引;所述读取方法包括以下步骤S601-S604;

S601、从索引的根节点出发,判断当前节点的节点前缀与待读取数据是否匹配;

S602、若匹配,则通过当前节点中的索引模型,计算所述待读取数据的目标槽位;

S603、若所述目标槽位为数据槽位,则判断所述数据槽位中的数据与待读取数据是否匹配,若匹配则返回所述数据槽位中的数据;

S604、若所述目标槽位为指针槽位,则在所述指针槽位指向的子节点中查询所述待读取数据,直至返回读取结果。

具体的,请参照图7,开始读取数据之后,调用search函数查询待读取数据key对应的值,从根结点出发,比较当前结点对应的前缀和key的前缀是否相等,如果不相等,直接返回NULL;如果相等根据key和节点中的模型预测出待读取数据在结点中的位置(也即目标槽位),并去该位置查看,一共有三种可能:第一:该位置里面没有数据,则返回NULL;第二:该位置存在数据,则比较其key和要查询的key,相等则返回对应的值,不相等则返回NULL;第三:该位置存的是指向子结点的指针,则对子结点进行递归查询,重复上面的过程,直到返回读取结果。

这里,所述返回读取结果包括返回NULL,或者返回待读取数据对应的值。

由于通过本申请实施例所述索引构建方法所构建的索引中维护有数据的存储顺序,因此,可以进行范围查询。

本申请实施例所提供的数据读取方法还包括:

针对待读取的数据范围,确定出所述数据范围的边界数据;其中,所述边界数据为所述数据范围内最大的数据和/或最小的数据;

在索引中确定出所述边界数据的存储位置;

并根据索引中数据的存储顺序和所述边界数据的存储位置,返回匹配所述待读取的数据范围的读取结果。

具体的,以查询key不小于lower_key的所有KV为例,由于本申请实施例所述索引构建方法所构建的索引会维护存储数据的顺序,所以查询时可以先确定lower_key对应对象的位置,这个过程和读流程类似,首先根据lower_key预测出值在结点中的位置后,去该位置查看,一共有三种可能:第一:该位置里面没有数据,则在该位置往后继续找,重复这个过程,直到找到第一个不小于lower_key的key;第二:该位置存在数据,则比较其key和要更新对象的key,小于或等于该key则在该位置往后继续找,重复这个过程,直到找到第一个不小于lower_key的key;第三:该位置存的是指向孩子结点的指针,则对孩子结点进行递归查询,重复上面的过程,直到找到第一个不小于lower_key的key。然后从该key的位置开始,遍历访问后序所有位置,如果位置没有数据,则跳过;如果位置存在数据,则将数据加入结果集;如果位置存的是指向孩子结点的指针,则对孩子结点进行同一过程,直至遍历完所有位置后则返回范围查询的结果。

这里,需要说明的是,在插入新的数据时,插入过程与数据读取流程是类似的。

当通过本申请实施例所述索引构建方法构建的索引删除数据时,删除流程如下:和读流程类似,首先要根据key找到对应对象的位置(即目标槽位),才能进行删除操作;根据key预测出值在结点中的位置后,去该位置查看,一共有三种可能:第一:该位置里面没有数据,则返回false;第二:该位置存在数据,则比较其key和要删除对象的key,相等则将其删除,并且判断当前Node(即当前节点)是否为空,如果为空,则删除当前Node和相关元数据,并返回true;第三:该位置存的是指向子结点的指针,则对子结点进行递归查询,重复上面的过程,直到返回结果。

这里,虽然删除操作影响结点实际的最长公共前缀,但出于性能考虑,并不会重新计算最长公共前缀,因为这对正确性并没有影响,原最长公共前缀只会比实际新最长公共前缀略短,但仍然是公共前缀。

当通过本申请实施例所述索引构建方法构建的索引删除数据时,更新流程如下:和读取数据的流程类似,首先要根据key找到对应对象的位置(即目标槽位),才能进行更新操作;根据key预测出值在结点中的位置后,去该位置查看,一共有三种可能:第一,该位置里面没有数据,则返回false;第二:该位置存在数据,则比较其key和要更新对象的key,相等则修改其值,并返回true;第三:该位置存的是指向子结点的指针,则对子结点进行递归查询,重复上面的过程,直到返回结果。

基于同一发明构思,本申请实施例中还提供了与索引构建方法对应的索引构建装置,由于本申请实施例中的装置解决问题的原理与本申请实施例上述索引构建方法相似,因此装置的实施可以参见方法的实施,重复之处不再赘述。

请参照图8,图8示出了本申请实施例所述索引构建装置的结构示意图,具体的,所述索引构建装置包括:

确定模块801,用于将初始数据输入前缀树的第一目标节点,根据所述初始数据和所述第一目标节点的预设空间放大率阈值,确定出所述第一目标节点的目标前缀长度;

划分模块802,用于根据第一目标节点的目标前缀长度,将所述初始数据划分为多个子数据集,和/或从初始数据中筛选出存储在所述第一目标节点的待存储数据;其中,所述子数据集中的初始数据具有相同的节点前缀;

计算模块803,用于根据节点前缀和/或待存储数据确定出第一目标节点的索引模型,并通过所述索引模型分别计算每一子数据集的节点前缀对应的指向子节点的指针以及存储位置,和/或分别计算每一待存储数据的存储位置;

第一构建模块804,用于将每一节点前缀和指向子节点的指针、和/或每一待存储数据存储在对应的存储位置中,构建出所述第一目标节点的索引结构;

第二构建模块805,用于将构建好的第一目标节点的子节点作为新的第一目标节点,将子节点对应子数据集作为新的初始数据,构建所述新的第一目标节点的索引结构,直至满足构建完成条件,构建出整个索引。

基于同一发明构思,本申请实施例中还提供了与索引构建方法对应的电子设备,由于本申请实施例中的电子设备解决问题的原理与本申请实施例上述索引构建方法相似,因此电子设备的实施可以参见方法的实施,重复之处不再赘述。

请参照图9,图9示出了本申请实施例所述电子设备的结构示意图,所述电子设备900,包括:处理器901、存储器902和总线,所述存储器902存储有所述处理器901可执行的机器可读指令,当电子设备900运行时,所述处理器901与所述存储器902之间通过总线通信,所述机器可读指令被所述处理器901执行时执行所述的索引构建方法的步骤。

基于同一发明构思,本申请实施例中还提供了与索引构建方法对应的计算机可读存储介质,由于本申请实施例中的计算机可读存储介质解决问题的原理与本申请实施例上述索引构建方法相似,因此计算机可读存储介质的实施可以参见方法的实施,重复之处不再赘述。

本申请实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行所述的索引构建方法的步骤。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和装置的具体工作过程,可以参考方法实施例中的对应过程,本申请中不再赘述。在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个模块或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。

所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,平台服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。

以上仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以权利要求的保护范围为准。

技术分类

06120115638174