Page 266 - 《软件学报》2026年第3期
P. 266

袁巩生 等: JIT  编译技术在可插拔存储引擎数据库中的应用                                                 1229


                 理. 如何筛选下推表达式将在第         3.2  节进行详细探讨.
                    (3) 表达式编译模块. 该模块的主要功能是将筛选出来的谓词表达式转换为能够直接执行的机器码, 这个过
                 程是  JIT  编译系统的核心. 首先, 表达式编译模块以自底向上的方式遍历表达式树, 利用                      LLVM C++ API 将其转
                 化为  LLVM IR (LLVM intermediate representation). LLVM IR  是编译过程中的核心表示形式, 它比机器码更接近
                 高级语言, 且与目标平台无关. 为了提升编译效率和避免重复计算, 编译模块会执行一些常见优化操作, 如常量
                 折叠、常量传播等. 最后, 表达式编译模块会根据不同硬件架构的特性, 将                       LLVM IR  编译为目标机器码并链接
                 到原本的查询执行进程中, 机器码将在查询执行时动态加载和执行. 本文第                         3.3  节将给出表达式编译具体算法
                 流程.
                    (4) 引擎层过滤模块. 该模块利用下推的机器码, 在存储引擎层对数据进行提前过滤. 以                        InnoDB  引擎为例, 磁
                 盘中存储的数据通常采用          InnoDB  格式. 当进行全表扫描时, 传统方法需要将整条记录从磁盘读取并转换为
                 MySQL  格式, 这一过程涉及大量的格式转换和数据复制开销. 引擎层过滤模块通过下推的字段编号, 仅转换查询
                 所需的字段数据, 避免了对整条记录的格式转换. 接着, 模块根据下推的机器码对字段数据进行表达式求值, 只有
                 满足谓词条件的记录才会被进一步处理并转换为                  MySQL  格式. 经过过滤后的数据会加入缓冲池中, 而不符合条
                 件的记录则会被过滤掉. 当下推的谓词整体选择率较低时, 这一处理方式能够有效避免将无用数据加载到缓冲池
                 中, 减少了内存和     I/O  开销从而提升性能. 后续的实验验证了这一点. 最终, 缓冲池中符合条件的数据会被上传到
                 服务层进行后续的操作. 在第         3.4  节阐述存储层过滤操作的实现细节.

                  3   基于  LLVM  编译器的    JIT  编译方法

                    本节将详细介绍       JIT  编译技术各个模块的实现细节, 包括使用           JIT  编译的考量、下推表达式的筛选以及物理
                 查询执行计划之上生成代码的算法细节等.
                  3.1   JIT  编译准备模块
                    本节首先介绍解释执行和编译执行各自的优缺点, 然后介绍                     MySQLJ 优化器如何选择解释执行还是编译执
                 行, 最后介绍   JIT  编译实例的初始化过程.
                  3.1.1    MySQL  中的表达式求值
                    表达式求值在      SQL  查询中无处不在, 涵盖了过滤、聚合、投影, 甚至连接操作等多个方面. 本文主要聚焦于
                 SQL  查询中的谓词表达式. 谓词表达式由          n (n≥0) 个 AND/OR  逻辑操作组合条件判断, 形成谓词表达式子句. 在某
                 些场景下, 谓词表达式的计算开销可能占据大部分查询执行时间, 成为系统瓶颈. 图                         2  展示了在执行    TPC-H  基准
                 查询  Q6  时, 谓词表达式计算所带来的       CPU  开销.

















                                        图 2 TPC-H  查询  Q6  及其谓词表达式求值      CPU  开销

                    实际上, 在   TPC-H 数据集的测试中, 复杂表达式的低效计算已被视为数据库查询的主要瓶颈. 图                         2  右侧展示
                 了在解释执行方式下应答         TPC-H  查询  Q6  时谓词表达式求值相关函数的         CPU  调用开销. 从图中可以看到大部分
   261   262   263   264   265   266   267   268   269   270   271