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  编译的性能, 但查询执行时间依然能
                 得到显著降低.
   267   268   269   270   271   272   273   274   275   276   277