Page 347 - 《软件学报》2025年第8期
P. 347

3770                                                       软件学报  2025  年第  36  卷第  8  期


                 更新往往存在一定的规律和特征. 因此, 如何及时响应这些频繁的数据查询和更新操作是研究的关键.
                    索引在数据库中扮演着至关重要的角色, 主要用来提高查询效率. 索引的性能在一定程度上决定着数据库的
                 查询性能. 索引结构需要牺牲额外内存空间, 用以存储数据库表中                    1  列或多列的属性值     (key) 的排序结果, 以及表
                 中对应数据在物理标识数据页中的逻辑指针列表. 由于高内存开销, 传统的索引结构难以处理爆炸式增长的数据,
                 随着数据量大规模增加, 数据关系更加复杂, 传统索引占有的存储空间也随之增加, 查询速度变得越来越慢. 为了
                 解决这些问题, 学习型索引概念进而被提出, 已成为当今数据库领域的研究热点                        [1−2] .
                    早期的学习型索引使用机器学习模型取代传统的索引结构                     (树形结构、网格结构等), 模型在存储和使用方面
                                        [3]
                                                                                                      [4]
                 都有显著的优势. RadixSpline 针对一维数据优化分段策略, 用线性插值模型适应不同段内数据的分布. LISA 、
                     [5]
                               [6]
                                        [7]
                 Flood 、Tsunami 、LMSFC 将类似策略运用于高维数据中, 先将高维数据降维到一维或用空间插值函数, 找到
                 key  与顺序存储位置的映射模型. 但这些高维学习型索引存在频繁更新困难这一致命的缺陷. 因为索引中的模型
                 是通过对原始数据和记录位置之间的关系进行学习和分析得到, 在插入新数据时, 会破坏原始的数据分布, 旧的模
                                                                                [9]
                                                                        [8]
                 型偏离原始数据分布, 在大量更新后, 不得不进行在线重新训练. LIFOSS 、FLIRT 考虑流数据场景下的索引, 虽
                 然数据频繁更新, 但数据规模限制在一个滑动窗口内, 解决方案完全不同.
                    一些研究如     DIC [10] 、RLR [11] 另辟蹊径, 依靠强化学习的强大决策能力, 在索引构建过程中充分考虑了数据集
                 的数据分布和查询分布, 找到现有传统有序索引结构与无序索引结构                       (B-Tree [12] 和哈希  [13] ) 的近似最优组合, 构建
                 出最理想的结构. 尽管它利用强化学习来增强传统索引性能, 但它仍存在与传统索引相同的缺陷. 并且随着数据的
                 不断更新, 索引会逐渐“偏离最优结构”, 除非定期在线重新训练, 性能依旧不理想. 如图                       1  所示, 重训练的代价是无
                 法容忍的查询时延. 因此, 如何避免或延缓重新训练, 已成为学习型索引可持续发展的挑战.

                                          1E6                      1E5  重训练时间
                                        插入时延 (ns)  2 1           时间 (ns)  5  插入时间



                                         0
                                           0     0.5    1.0      0  1 2 3 4 5 6 7 8
                                              插入数据量     1E5            重新练次数
                                       (a) 插入 0.1 M 键每次的插入时延   (b) 重训练时间与插入时间的比较
                                              图 1 模型重训练对索引性能的影响

                    在目前一维学习型索引的研究中, 大多通过存储机器学习得到的模型                        (如线性回归模型) 来表达数据的存储
                 分布, 辅助或取代传统的索引结构, 从而实现更低的内存占用和更高的查询性能. 面对数据更新, 其处理方案分为
                 以下  3  类. (1) 预留间隙处理更新. 例如    ALEX [14] 根据一定密度在每个叶子节点预留间隙, 在最初插入时只需移动
                 少量键甚至不移动即可完成数据的插入. 然而, 随着插入数量逐渐增多, ALEX                     会因为空隙区域变满、空闲空间变
                 少, 使冲突随之增加, 因而需要移动大量键来处理插入操作. (2) 额外的缓冲区加速更新. 例如                        PGM [15] 等, 通过为每
                 个段添加额外的缓冲区来处理更新操作. 当缓冲区满时, 需要重新执行分段, 即重新训练模型. (3) 分裂处理冲突.
                 例如  LIPP [16] 通过向下分裂创建新节点来处理插入导致的冲突. 但数据更新会影响当前数据的分布, 随着模型的逐
                 渐失效, 这些工作需要频繁改变自身结构, 甚至是定期在线重新训练来处理数据更新, 从而使其性能受到影响. 上
                 述工作在处理数据更新时, 几乎都会增加额外的内存消耗. PGM                   提出了一种有损压缩方法来降低内存占用, 但这
                 种有损参数压缩方式影响索引查询性能.
                    Waffle [17] 首次将强化学习用在处理移动目标查询的索引更新问题上, 其底层的网格结构支持并发进行索引的
                 访问和索引结构的更新调整, 避免了因为重构索引而导致的查询暂停. 线程中的强化学习持续进行, 代替“阻塞式”
                 的重新训练, 动态的二维网格结构可以不断地适应频繁变化的数据. 移动目标场景下的数据变化特征                                (key  的总量
                 基本不变, 但分布实时变化) 与通用场景下的一维数据的随机更新明显不同, Waffle 的相关策略和算法并不能直接
                 应用到对一维索引结构的更新中. LSM RUM-Tree          [18] 利用  LSM-Tree [19] 思想优化传统高维索引  R-Tree 的更新策略,
                 但不能直接用于一维学习型索引的更新优化.
   342   343   344   345   346   347   348   349   350   351   352