摘 要: 索引是数据库系统中用于提升数据存取性能的主要技术之一.在大数据时代,随着数据量的不断增长,传 统索引(如 B+树)的问题日益突出:(1)空间代价过高.例如,B+树索引需要借助 O(n)规模的额外空间来索引原始的数 据,这对于大数据环境而言是难以容忍的.(2)每次查询需要多次的间接搜索.例如,B+树中的每次查询都需要访问从 树根到叶节点路径上的所有节点,这使得 B+树的查找性能受限于数据规模.自 2018 年来,人工智能与数据库领域的 结合催生了“学习索引”这一新的研究方向.学习索引利用机器学习技术学习数据分布和查询负载特征,并用基于数 据分布拟合函数的直接式查找代替传统的间接式索引查找,从而降低索引的空间代价并提升查询性能.首先对学习 索引技术的现有工作进行了系统梳理和分类;然后,介绍了各种学习索引技术的研究动机与关键技术,对比分析了各 种索引结构的优劣;最后,对学习索引的未来研究方向进行了展望.
1.存在的原因:
传统索引 在大数据环境下呈现出两个主要问题:
(1)空间代价过高.例如,B+树索引需要借助 O(n)规模的额外空间来索引 原始的数据,这对于大数据环境而言是难以容忍的.
(2)每次查询需要多次的间接搜索.例如,B+树中的每次查询 都需要访问从树根到叶节点路径上的所有节点.这使得 B+树的查找性能在大规模数据集上将变得较差.
1 面向一维范围查询的学习索引
面向一维范围查询的索引结构,需要高效地支持插入、删除、更新、点查询和范围查询等操作.这一类型的索引结构应用最为普遍,被大多数通用型数据库采纳为默认索引。常见的面向一维范围查询的索引结构有 B+ 树和日志结构合并(log-structured merge,简称 LSM)树。目前,使用机器学习模型替代这一类型的索引结构吸 引了较多的关注
B+树可以看作是一个模型,它的输入是一个键,输出是该键对应的记录在排序数组中的位置。.可以将 B+树看作一个回归树(regression tree),它将一个键映射到一个具有最大误 差界限(error bound)(即内存块或磁盘页大小)的数组位置,并保证如果该键对应的记录存在,就可以在误差范围 内找到它[7].因此,用其他机器学习模型替代 B+树是可行的,只要这些模型也能够提供类似的保证.显然,所有的 回归模型都能够提供类似的保证,包括线性回归模型和神经网络模型.
总的来说,面向一维范围查询的学习索 引的设计目标如下:在一个排序数组上,使用一个或一组模型有效地近似累积分布函数(cumulative distribution function,简称 CDF),使用该模型可以高效地预测出给定键在数组中的位置.
Kraska等人提出了学习索引框架(learning index framework,简称LIF)和递归模型索引(recursive model index,简称 RMI)。RMI 旨在解决学习索引的精度问题
RMI 的结构(如图 1 所示)是由多个模型组成的分层模型结构.其中,第 1层只有一个模型,其余每一层都包含多个模型.RMI 中的每一个模型都以键 作为输入,并返回一个位置.上层模型的输出结果用于选择下一层的模型,最后一层模型的输出作为 RMI 的输 出
RMI 的分层模型结构有以下优点:
1)它利用了之前实验得到的结论,即机器学习模型可以拟合 CDF 的大体形状,这是 RMI 中第 1 层模型 的作用.由于建立在整个数据集上的单一模型难以精确定位到单条记录,RMI 将数据集划分为更小的 子空间,并在每个子空间上训练模型,从而提高查找精度
2)RMI 允许构建混合使用多种模型,因此能够充分利用不同模型的优点.对于第 1层模型,使用神经网络 是一种较好的选择,因为神经网络通常能够学习复杂的数据分布.RMI 的底层可以考虑线性回归模 型,因为线性回归模型具有更低的空间代价和执行成本.如果数据分布难以拟合为某种模型,叶节点 允许退化为 B+树节点,这保证了学习索引的最差查找性能与 B+树相当.
在 RMI 输出预测的位置后,还需要在排序数组中进行最后的搜索.RMI 的最底层的每个模型在训练时会保存一个误差界限,后续的搜索策略使用预测值作为中心点,在误差范围内执行二分搜索. Kraska等人报告的实验 结果[7]令人振奋:在多个数据集上,学习索引的查找性能比B+树快 1.5 倍至 3 倍,并且仅占用了比 B+树低 2 个数 量级的空间
2. 面向多维范围查询的学习索引
多维查询是指一次查询涉及多个属性维度.最经典的多维查询应用是空间查询.这类查询返回二维平面空间中的一个矩形范围,目前关于空间索引已有大量研究成果,主要可分为以下三类:
第一类索引将空间划分为区域,并对这些区域建索引,典型的索引结构有 KD 树[59](面向 k 维空间)、四叉树(quadtree)[60](面向二维空间)和八叉树(octree)[61](面向三维空间).
第二类索引将数据集划分为不同的子集,然后 对这些子集进行索引,经典的索引结构有R树[62]和它的变体[63-65].
第三类索引将多维空间转换为一维空间,然后 在一维空间上建索引,典型的转换方法有希尔伯特空间填充曲线(Hilbert space filling curve)[66]和 Z 顺序曲线 (Z-order curve)[66,67].这些结构有的是专为二维或三维空间设计的,有的结构可以适用于更高维空间,或者易于扩 展到高维场景.
将学习索引的思想应用到多维索引中并不容易,因为学习索引要求数据有序,而多维数据并不是天然有序的.一种直观的解决方式是使用第三类索引,即将多维空间上的数据投影到一维空间上,并在一维空间上建立学 习索引.这种方法的难点在于投影策略的设计.如果使用简单的多维CDF作为映射函数,那么具有相同映射值的 两个点可能在多维空间中相距很远.所以,设计优秀的映射函数,或者说设计优秀的数据布局(data layout)策略, 是设计学习多维索引的关键
3 面向点查询的学习索引
它们不支持或不需要范围查询.针对这些应用需求,人们设计了面向点查询的索引结构.例如,哈希索引具有 O(1)的查询时间复杂度和空间复杂度,优于 B+树索引结构。
学习哈希索引的目标是将学到的数据分布均匀的映射到给定数量的哈希桶中,这 只需要将键的 CDF 按照给定的哈希桶数量缩放即可.与面向范围查询的学习索引相同,学习哈希索引继续使用 RMI 模型学习键的分布.与简单的哈希函数相比,学习哈希索引显著降低了哈希冲突的概率。学习哈希索引的大小不会受到数据集大小的影响。在较小的数据集 上,学习哈希索引显然在空间效率上不具备优势.
4 面向存在查询的学习索引
存在查询用于判断某一元素是否存在于一个集合中.最经典的支持存在查询的数据结构是布隆过滤器(Bloom filter)。 布隆过滤器由一个二进制位向量和一组哈希函数组成,具有高插入 性能、高查找性能、低空间占用等优点.当插入一个新的元素时,布隆过滤器使用哈希函数将键映射得到一组 数字,并在二进制位向量中将这组数字对应的位置设为 1.当查找某个元素时,如果元素对应的一组哈希值在二 进制向量中都为 1,则布隆过滤器判定该元素存在于集合中,否则判定不存在
学习哈希索引的目标是降低存在的键之间的冲突概率,而学习布隆过滤器的目标是降低存在的键 与不存在的键之间的冲突概率
7 结束语
学习索引尝试使用机器学习模型直接替代传统的数据库索引结构,并提升查找性能和降低索引的空间代价.学习索引是目前机器学习和数据库技术相结合的一个重要突破,因此一经提出即引起了学术界的广泛关注. 本文综述了学习索引的研究进展,并提出了学习索引的一个分类框架.基于该分类框架,论文详细讨论了各类学 习索引的问题、进展和存在的问题.其中,第一类是面向一维范围查询的学习索引,这一类学习索引得到了最多 的关注,在插入策略和模型设计等方面得到了优化.第二类是面向多维范围查询的学习索引,这一类工作主要关 注如何将多维空间数据投影到一维空间,并使用面向一维空间的机器学习模型进行学习.第三类是面向点查询 的学习索引,这一类工作关注如何使用机器学习方法降低或增加哈希冲突的概率.最后一类是存在索引,这一类 工作将存在查询建模为二元概率分类任务.最后,论文还介绍了面向学习索引的测试基准研究进展,并对学习索 引的未来研究方向进行了展望.