鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

原理描述

计算路径优化包括记录匹配优化、字符集处理的SIMD(Single Instruction Multiple Data,单指令多数据)优化和非对齐内存访问优化。

记录匹配优化

本优化针对采用固定行格式的记录,将原有逐字段遍历匹配的方式优化为基于memcmp的整体记录比较,从而提升比较效率。

在InnoDB存储引擎中,原比较逻辑通过函数cmp_dtuple_rec_with_match_low逐字段对比数据结构dtuple_t(内存记录格式)与数据结构rec_t(页物理记录格式),比较前还需调用rec_get_offsets获取字段偏移量。优化后,通过memcmp直接比较整条记录,不仅减少了比较次数,也避免了频繁调用rec_get_offsets带来的开销。

在代码实现层面,主要调整包括:

  • 在row_search_mvcc函数中,以memcmp替换原有的cmp_dtuple_rec比较逻辑。
  • 在page_cur_search_with_match函数中,采用新的字节级比较方法rec_direct_memcmp进行调用,替代原有的rec_get_offsets方法与cmp_dtuple_rec_with_match方法。

使用memcmp进行记录比较需满足以下条件:

  • 所有字段均支持通过memcmp进行比较(参见函数dtype_is_memcmp_deterministic)。
  • 所有字段为固定长度且定义为非空。
  • 所有字段按相同升序排列。

此外,InnoDB原仅缓存内部表的记录偏移量。本优化进一步将偏移量缓存机制扩展至所有含固定长度字段的索引,实现偏移量的复用,减少重复计算,从而提升B-tree搜索的整体性能。

字符集处理SIMD优化

本优化利用SIMD指令对utf8/utf8mb4字符集处理过程进行向量化加速,提升相关运算效率。

由于utf8/utf8mb4为变长编码,处理时常需预先计算字符长度或将其转换为定长Unicode格式(2字节),再进行后续操作。考虑到其中ASCII字符(范围0–127)为单字节定长,且其Unicode表示仍为原值(高字节补零),可针对该部分字符实施SIMD并行处理,以提高处理吞吐量。

在代码实现层面,主要对以下函数进行优化:

  • 在my_collation_utf8_general_ci_handler中,优化my_strnxfrm_unicode、my_hash_sort_utf8及my_hash_sort_utf8mb4。
  • 在my_charset_utf8_handler中,优化my_numchars_mb和my_charpos_mb。

非对齐内存访问优化

在早期ARM架构(如ARMv5)中,由于不支持非对齐内存访问,MySQL在指针到整型的转换过程中采用逐字节读取并移位累加的方式。而在x86架构中,支持非对齐内存访问,可直接进行指针类型强制转换。鲲鹏920处理器已具备非对齐内存访问能力,因此可将x86中相应的优化策略移植至ARM架构,直接将指针转换为整型变量,从而提高类型转换效率。