经典 Learned Index 结构设计及其应用

news2024/10/5 19:10:46

引言

学习索引是一种新型的索引结构,可以帮助数据库更快地查找数据。学习索引的诞生可以追溯到 2017 年,由 Google Brain 团队的 Kraska 等人在论文[1]中首次提出,探讨了使用神经网络替代传统数据结构(如 B-Tree)来构建索引的可行性。其工作方式是通过机器学习算法学习数据分布规律,构建一个能够预测数据位置的函数。当需要查找某个数据时,只需要使用这个函数预测出数据的位置,然后直接访问即可,而不需要在整个数据集中进行搜索。因此,学习索引可以大大提高数据的访问速度,减少搜索时间。不仅如此,学习索引只需要存储习得的参数,不需要存储大量的内部卫星节点,显著地降低了存储空间地占用,这对于大规模数据存储和处理都非常有帮助。

在这几年里,学习索引的研究受到了广泛的关注和讨论。研究人员在模型的训练和优化、索引结构的设计和实现等方面做出了许多创新和改进。本篇聚焦学习索引结构设计,为读者归纳近几年知名会议或期刊上的学习索引结构,希望能对这方面的研究者有所启发和帮助。

RMI(开山鼻祖)[1]

RMI 全名叫 Recursive Model Indexing,是一种经典的模型,由 Kraska 等人在 2018 年 SIGMOD 提出。RMI 模型是一种递归模型,它的主要思想是将数据集分成若干个子集(每个子集包含的数据量相等),并对每个子集训练一个能够预测数据位置的模型。这些模型被组织成一个树形结构,根节点是一个能够将查询分配到子集中的路由模型,叶节点则是最终的预测模型(集成学习的思想)。当需要查询数据时,RMI 模型使用路由模型将查询分配到合适的子集中,然后在该子集中使用相应的预测模型进行数据查找。
RMI 模型具有较高的预测精度和较快的查询速度。但是,RMI 训练需要大量的时间和计算资源,同时,不支持实时的更新和写入(需要重新训练模型)。

代码仓库:https://github.com/learnedsystems/RMI(作者开源)

FITing-Tree[2]

FITing-Tree 使用了 Linear Model 来拟合底层的数据分布,采用了 Bottom-Up 的方式建立索引。其整体的思想是保留了 B+树的内部节点(作为导航),把叶子节点替换成学习模型,不存储实际数据,而是存储学习模型的参数。因此,极大地降低了索引的存储开销。FITing-Tree 支持插入,其方式是在每个 Segment 内存储一个缓冲区,当缓冲区满,删除过时的 Segment,插入新的 Segment。从这篇工作以后,Linear Model 成为学习索引模型的首选(性能好、开销小)。

代码仓库:https://github.com/JiananYuan/FITing-Tree(民间实现)

ALEX[3]

ALEX 专门为了解决 RMI 学习索引不支持高效插入而设计。ALEX 的基本思想是在内部节点和叶子节点使用学习模型,并留了空隙(Gapped Array,简称 GA,scatter in node,而不是像 B+树那样,全部空隙都推到了后面)。在插入的时候,这些 GA 对于插入的数据有良好的“吸收”性能。当 GA 数量不足时,ALEX 会采取一定的方式进行节点调整。ALEX 是目前整体性能都比较好的学习索引之一,其代码设计也非常值得学习。

代码仓库:https://github.com/microsoft/ALEX(作者开源)

LIPP[4]

LIPP 基本结构类似 ALEX,但其设计的 insight 是:学习索引的“最后一公里”查询是查询瓶颈之一。LIPP 的基本思想是:只要计算得出 key 的预测值 pos,那么 key 就一定存在 array[pos]这个位置,不需要在上下误差界限内进行 the last mile search。当然,这种方法也有一定代价:在插入数据时,如果预测位置已有数据,需要触发节点调整。

代码仓库:https://github.com/Jiacheng-WU/lipp(作者开源)

PGM[5]

PGM 的基本节点单元使用 Linear Model,采用 Bottom-Up 的构建方式,上一层对下一层的代表数据(每个 Segment 的起始点)递归地使用线性回归来构建索引树,其插入采用了类似 LSM 层次合并的思想来设计。

代码仓库:https://github.com/gvinciguerra/PGM-index(作者开源)

RadixSpline[6]

样条回归也是拟合数据的一种方式。RS 索引是一种构建时间复杂度为 O(n)的结构,只需要从前往后扫描待索引的数据,索引即可建立。RS 模型会从前往后,计算出哪两个数据之间的全部数据,可以被端点数据用 spline 拟合,个人理解有点像数据蒸馏(图中蓝点)。接着,为了进一步加快在所有 spline points 检索到目标 point 的速度,添加了 Radix 表(前缀表),根据数据的前 prefix 位,定位到候选 spline points 的起始和终止位置。查询时,提取 key 的前 prefix 位,在起止 spline points 之间查询得到可能包含 key 的样条,再通过计算得到 key 的大致存储位置。

代码仓库:https://github.com/learnedsystems/RadixSpline(作者开源)

HERMIT[7]

HERMIT 被设计用于处理表格中大量列的索引,当这些列之间存在高度相关性时,索引存储开销变得不可忽视。HERMIT 的核心结构是 TRS-Tree,是一种基于树的索引结构,这种结构可以将一个列上面的数据映射到另外具有相关性的一列上面。TRS-Tree 避免了建立二级索引带来的存储开销,因其基于列相关性使用了轻量级的学习模型来替代重量级的传统节点。但其查询性能,尤其是点查询性能,却可能比基线(B+树)还差。

代码仓库:无开源

总的来说,目前学习索引的结构很大程度被限定在线性回归模型里面,没有见到其他行之有效的学习模型来替换。更多的工作是在如何组织这些训练出来的线性模型下功夫,抑或是将已有结构稍作变化或不做变化,应用在某个场景下,在查询性能或存储开销取得了优良的性能。典型论文如下但不局限于下文(以下代码仓库均为作者开源):

和 LSM-tree 结合

  • OSDI 20:From WiscKey to Bourbon: A Learned Index for Log-Structured Merge Trees

    代码仓库:https://bitbucket.org/daiyifandanny/learned-leveldb/src/master/

  • TPDS 33(8):TridentKV: A Read-Optimized LSM-Tree Based KV Store via Adaptive Indexing and Space-Efficient Partitioning

    代码仓库:https://github.com/emperorlu/Learned-RocksDB

支持 String

  • ApSys 20:SIndex: A Scalable Learned Index for String Keys

    代码仓库:https://ipads.se.sjtu.edu.cn:1312/opensource/xindex/-/tree/sindex

并行并发/分布式/RDMA

  • OSDI 20:Fast RDMA-based Ordered Key-Value Store using Remote Learned Cache

    代码仓库:https://github.com/SJTU-IPADS/xstore

  • FAST 23:ROLEX: A Scalable RDMA-oriented Learned Key-Value Store for Disaggregated Memory Systems

    代码仓库:https://github.com/iotlpf/ROLEX

  • PPoPP 20:XIndex: A Scalable Learned Index for Multicore Data Storage

    代码仓库:https://ipads.se.sjtu.edu.cn:1312/opensource/xindex

新型存储

  • VLDB 16(2):PLIN: A Persistent Learned Index for Non-Volatile Memory with High Performance and Instant Recovery

    代码仓库:https://github.com/tawnysky/PLIN

  • VLDB 15(3):APEX: A High-Performance Learned Index on Persistent Memory,APEX 主要基于 ALEX 适配持久内存

    代码仓库:https://github.com/baotonglu/apex

传统赛道打出新花样

  • ASPLOS 23:LeaFTL: A Learning-Based Flash Translation Layer for Solid-State Drives

    代码仓库:https://github.com/platformxlab/LeaFTL

尾注

本片所述 learned index 的结构不涉及多维索引结构。

参考文献

[1] Kraska T, Beutel A, Chi E H, et al. The case for learned index structures[C]//Proceedings of the 2018 international conference on management of data. 2018: 489-504.

[2] Galakatos A, Markovitch M, Binnig C, et al. Fiting-tree: A data-aware index structure[C]//Proceedings of the 2019 International Conference on Management of Data. 2019: 1189-1206.

[3] Ding J, Minhas U F, Yu J, et al. ALEX: an updatable adaptive learned index[C]//Proceedings of the 2020 ACM SIGMOD International Conference on Management of Data. 2020: 969-984.

[4] Wu J, Zhang Y, Chen S, et al. Updatable Learned Index with Precise Positions. Proceedings of the VLDB Endowment, 2021, 14(8): 1276-1288.

[5] Ferragina P, Vinciguerra G. The PGM-index: a fully-dynamic compressed learned index with provable worst-case bounds[J]. Proceedings of the VLDB Endowment, 2020, 13(8): 1162-1175.

[6] Kipf A, Marcus R, van Renen A, et al. RadixSpline: a single-pass learned index[C]//Proceedings of the third international workshop on exploiting artificial intelligence techniques for data management. 2020: 1-5.

[7] Wu Y, Yu J, Tian Y, et al. Designing succinct secondary indexing mechanism by exploiting column correlations[C]//Proceedings of the 2019 International Conference on Management of Data. 2019: 1223-1240.

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/464305.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

appuploader 常规使用登录方法

转载:登录appuploader 目录 登录appuploader 常规使用登录方法 双击appuploader.exe 启动appuploader 点击底部的未登录,弹出登录框 在登录框内输入apple开发者账号 如果没有apple开发者账号,只是普通的apple账号,请勾选上未…

题目 2056: 汉诺塔 ==理解递归

题目 2056: 汉诺塔 https://www.dotcpp.com/oj/problem2056.html 做题情况 参考代码: //package Dotcpp;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();// prin…

3.30 haas506 2.0开发教程-example - SD卡存储数据读写

SD卡存储数据读写 案例说明数据的写入与读取串口工具读取数据接收数据CSV格式 案例说明 部分设备使用过程中需要保存大量数据到TF卡中,大部分场景拔插TF卡有不太方便。 所以本案例介绍一种使用串口工具取出设备TF卡中的数据保存在电脑中的方法。 保存格式可以自己定…

详细安装使用教程】店侦探 - 跟踪店铺数据,学习运营技巧,引流关键词,电商人必备工具

简介 店侦探插件是一款电商网络浏览插件,能够帮助店主更好地运营自己的网店,这款插件功能十分全面强大,可以全面跟踪店铺的销量情况、引流关键词、直通车、营销活动、宝贝变更跟踪!感兴趣的朋友快来体验吧,跟踪店铺数…

常见的用户密码加密及破解方法

用户密码安全是互联网行业需要保障的重要安全之一,由于黑客的入侵和内部的泄露,保证用户密码安全并不是件容易的事情,但如果采用合适的算法加密用户密码,即使信息泄露出去,黑客也无法还原出原始的密码(或者还原的代价非…

vue3 封装ECharts组件

一、前言 前端开发需要经常使用ECharts图表渲染数据信息,在一个项目中我们经常需要使用多个图表,选择封装ECharts组件复用的方式可以减少代码量,增加开发效率。 ECharts图表大家应该用的都比较多,基础的用法就不细说了&#xff…

如何成为企业急需的技术人才:掌握这些技能,提升你的实力和竞争力

在当前竞争激烈的互联网环境中,作为程序员等技术岗,必须不断的学习,才能不断提升自身实力,锻炼自身技能。想要成为一名企业急需的技术人才,需要学习哪些技能呢? 一、IT技术发展背景及历程 IT技术是当今社…

如何借助分布式存储 JuiceFS 加速 AI 模型训练

传统的机器学习模型,数据集比较小,模型的算法也比较简单,使用单机存储,或者本地硬盘就足够了,像 JuiceFS 这样的分布式存储并不是必需品。 随着近几年深度学习的蓬勃发展,越来越多的团队开始遇到了单机存储…

【22-23 春学期】人工智能基础--AI作业6-误差反向传播

老师发布作业链接:(429条消息) 【22-23 春学期】AI作业6-误差反向传播_HBU_David的博客-CSDN博客 目录 老师发布作业链接:(429条消息) 【22-23 春学期】AI作业6-误差反向传播_HBU_David的博客-CSDN博客 1.梯度下降 2.反向传播 3.计算图 4.使用Numpy…

ROS第四十四节——路径规划

1.新建launch文件 nav05_path.launch <launch><node pkg"move_base" type"move_base" respawn"false" name"move_base" output"screen" clear_params"true"><rosparam file"$(find nav_dem…

Mybatis 知识总结1(入门、JDBC、数据库连接池、lombok介绍)

Mybatis 知识总结&#xff08;一&#xff09; 3.1 Mybatis 介绍 什么是 Mybatis ? MyBatis 是一款优秀的持久层框架&#xff0c;用户简化 JDBC 的开发。MyBatis 是 Apache 的一个开源项目 iBaits&#xff0c;2010年这个项目由 apache 迁移到了 google code&#xff0c;并且改…

Chapter 6 :CDC Constraints(ug903)

6.1 About CDC Constraints 跨时钟域&#xff08;CDC&#xff09;约束适用于具有不同发射和捕获时钟的时序路径。根据发射和捕获时钟的关系以及在CDC路径上设置的时序异常&#xff0c;有同步CDC和异步CDC。例如&#xff0c;同步时钟之间但被错误路径约束覆盖的CDC路径…

活动目录域服务

域用户能够使用[username]csk.cn进行登录。 创建一个名为“CSK”的OU&#xff0c;并新建以下域用户和组&#xff1a; sa01-sa20&#xff0c;请将该用户添加到sales用户组。 ma01-ma10&#xff0c;请将该用户添加到manager用户组。 除manager 组以外的所有用户隐藏C盘。 除…

深入理解 Linux 内核

文章目录 前言一、内存寻址1、内存地址2、硬件中的分段&#xff08;1&#xff09;段选择符 3、Linux 中的分段&#xff08;1&#xff09;Linux GDT&#xff08;2&#xff09;Linux LDT 4、硬件中的分页5、Linux 中的分页&#xff08;1&#xff09;进程页表&#xff08;2&#x…

CRLF注入漏洞、URL重定向、资源处理拒绝服务详细介绍(附实例)

目录 一、CRLF注入漏洞 漏洞简介 演示介绍 漏洞检测工具&#xff1a;CRLFuzz 二、URL重定向漏洞 漏洞简介 漏洞相关业务 演示介绍 创建重定向虚假钓鱼网站 三、WEB 拒绝服务 简介 漏洞相关业务 演示介绍 一、CRLF注入漏洞 漏洞简介 CRLF 注入漏洞&#xff0c;是因…

centos7 firewall-cmd主机之间端口转发

目录 1. firewalld1.1 firewalld守护进程1.2 控制端口/服务1.3 伪装IP1.4 端口转发 2. 案例2.1 配置ServerA2.2 安装nginx测试 &#xff08;可选&#xff09;2.3 开启端口2.4 伪装IP2.5 端口转发2.6 配置ServerB2.7 修改nginx页面显示内容2.8 访问ServerB2.9 访问ServerA 1. fi…

低代码是开发的未来,还是只能解决边角问题的鸡肋?

随着互联网行业寒冬期的到来&#xff0c;降本增效、开源节流几乎成为了全球互联网厂商共同的应对措施&#xff0c;甚至高薪酬程序员的“35岁危机”一下子似乎变成了现实。程序员的高薪吸引了各行各业的“跨界选手”&#xff0c;是编程门槛降低了吗&#xff1f;不全是&#xff0…

搭建linux邮件服务器

参考&#xff1a;企业级邮件服务器实战_哔哩哔哩_bilibili Linux 平台开源免货的邮件服务器包括: Sendmail、Postix、Omail ; 邮件服务器构成了电子邮件系统的核心&#xff0c;每个收信人都有一个位于某个邮件服务器上的邮箱(mailbox)&#xff0c;一个邮件消息的典型旅程是从…

管道命令(cut、grep、sort、wc、uniq、tee、tr、col、join、paste、expand/unexpand、split、xargs)

文章目录 管道命令(pipe)选取命令&#xff1a;cut、grepcut使用案例cut的优点缺点 grep使用案例 排序命令&#xff1a;sort、wc、uniqsort使用案例 uniq使用案例 wc使用案例 双向重定向&#xff1a;tee使用案例 字符转换命令&#xff1a;tr、col、join、paste、expandtr使用案例…

非量表数据应该如何分析?

问卷中的非量表数据应该怎么分析&#xff1f; 样本特征分析 对于非量表题的描述可以使用频数分析或者可视化图形进行描述&#xff0c;比如单选题也可以使用柱形图等进行展示&#xff0c;通过结果展示了解样本的基本情况&#xff0c;最后结合分析结果提出建议等。差异分析 除此之…