Page 272 - 《软件学报》2026年第3期
P. 272
袁巩生 等: JIT 编译技术在可插拔存储引擎数据库中的应用 1235
4.2.2 有无主键对 JIT 编译的影响
本节旨在展示谓词表达式中是否包含主键对 JIT 编译系统性能的影响. 实验采用表 2 中的 SQL 查询模板, 与
原生 MySQL 进行对比. 实验结果如图 5 所示, 当数据量为 10 万时, DATE 类型在包含主键的情况下, JIT 编译相
比于解释执行性能提升有 1.8%, 而不含主键时 JIT 编译性能是低于解释执行的. 当数据量为 50 万时, INT 类型和
DATE 类型的性能提升分别由 2.25% 和 4.48% 提升到了 9.98% 和 12.57%, 进一步表明当查询中含有主键时, 在小
数据量场景下, JIT 编译也能有一定的性能提升.
70
int_no_primary decimal_no_primary
Performance improvement (%) 40 date_with_primary varchar_with_primary
60
decimal_with_primary
int_with_primary
date_no_primary
50
varchar_no_primary
30
20
10
−10
−20 0
10 50 100 400 800 1 600
Data amount
图 5 有无主键场景下的性能提升
随着数据量的增加, 主键对 JIT 编译的优化效果更为明显, 在 1 600 万条数据的情况下, 包含主键的 INT 类型
查询通过 JIT 编译实现的性能提升达 54.20%, 而 DATE 类型的性能提升更为显著, 达到 68.89%. DECIMAL 和
VARCHAR 类型在启用 JIT 编译后, 性能提升幅度也分别达到了约 20%. 值得注意的是, 随着数据量的增加, 性能
提升的比例逐渐趋于饱和, 这一趋势与第 4.2.1 节的研究结果相一致.
当查询中包含主键时, MySQL 能够利用主键索引快速定位目标数据行, 避免了全表扫描. 这种优化使得上传
到服务层进行处理的数据量显著减少, 从而降低了 Handle 接口的 I/O 开销. 由于数据传输和 I/O 操作的减少, 过滤
操作在总查询处理中的占比相对提高, 这为 JIT 编译系统提供了更大的优化空间.
4.3 混合编译测试
本节将展示混合编译的性能表现. 测试将涵盖 INT、DECIMAL、DATE、VARCHAR 和 TINYTEXT 这 5 种
数据类型, 查询数据量分别为 10 万、50 万、100 万、400 万、800 万和 1 600 万. 下面为测试所用的 SQL 查询示例.
SELECT *
FROM test
WHERE (a > [int] AND a < [int])
AND (b > [date] AND b < [date])
AND (c > [decimal] AND c < [decimal])
AND (d > [varchar] AND d < [varchar])
AND (e > [tinytext] AND e < [tinytext]);
SQL 查询所涉及的数据类型中, TINYTEXT 是目前尚未支持的数据类型, 因此整体的 JIT 编译会使用混合
编译的方式. 当 JIT 编译后的机器码实际执行时, TINYTEXT 的表达式求值是通过调用 val_int() 实现的, 本质
上是解释执行的方式. 测试结果如图 6 所示, 在小数据量场景下, 混合编译的性能依旧不如解释执行. 但随着数
据量的增加, 混合编译的优势逐渐显现. 特别是在数据量达到 1 600 万时, 执行时间减少了 20.89%. 尽管存在
TINYTEXT 类型的求值需要回退到虚函数调用, 在一定程度上影响了 JIT 编译的性能, 但查询执行时间依然能
得到显著降低.

