【鲲鹏BoostKit技术速递】数据库字符集比较性能新突破:鲲鹏ARM SIMD加速引擎,让排序与哈希效率倍增!
交易监控、风控规则匹配、历史对账中密集的 GROUP BY 和哈希分区操作,受益于批量哈希计算与排序键生成的加速,CPU 占用明显下降,系统吞吐提升。鲲鹏 BoostKit 的改造思路是:在比较路径上,当数据以 ASCII 为主时,一次性加载一个向量块(NEON 16 字节或 SVE 32 字节),在这个块内批量完成 ASCII 判定、大小写归一化、权重映射和比较/哈希更新。在实际业务中,用户名、
一条看似普通的 ORDER BY name 查询,在数据量翻倍后,响应时间常常不止翻两倍——三倍、五倍的退化在线上系统中并不罕见。LIKE 'abc%' 这样的前缀匹配,放在百万行级别的大表上,耗时动辄以秒计。GROUP BY 分组查询随着数据增长,性能曲线不断下滑。
查索引、看执行计划、调缓冲池、甚至升级硬件规格,折腾一圈下来,瓶口依然卡在同一个地方。原因出在一个几乎被所有人忽略的角落——字符集比较。
MySQL/Percona 在排序、分组、去重、索引比较乃至表连接等操作中,底层都在密集地执行字符集处理。这些处理涉及多字节解码、大小写归一化、排序权重映射、逐权重比较等一系列流程。表里只有几千行数据时几乎感知不到,可一旦规模到了几百万、上亿行,这部分开销就成了实实在在的 CPU 瓶颈——它不直接出现在 EXPLAIN 输出里,却真实地拖慢着每一条 SQL 的响应时间。
鲲鹏BoostKit 正式推出字符集处理 SIMD 优化方案,针对 MySQL/Percona 字符集比较热点路径进行深度加速,排序、分组、哈希操作效率获得成倍提升。
字符集比较:一笔被忽略的“CPU账单”
先理清一个基本问题:数据库比较两个字符串,究竟在比什么?
以最常用的 utf8mb4_general_ci 排序规则为例。当数据库需要判断 "abc" 和 "ABC" 是否等价、或者确定两者的先后顺序时,内部走的是这样一套流程:
1. 将每个字符从多字节编码解码为宽字符
2. 根据排序规则进行大小写归一化
3. 查排序权重表,获取每个字符的排序权重
4. 从左到右逐权重比较
utf8mb4 编码下,单个字符可能占 1 到 4 个字节,每个字符都要完整走完上述流程。
但这里存在一个巨大的优化空间:对 ASCII 字符(英文字母、数字、常见标点),上述步骤绝大多数是多余的。ASCII 字符在 utf8mb4 中仅占 1 个字节,解码基本不花力气;大小写之间只差一个比特位(0x20),完全不需要查表。然而数据库的字符集处理逻辑并不会区分“简单字符”和“复杂字符”——它按统一流程,一个字符一个字符地处理到底。
在实际业务中,用户名、邮箱、订单号、商品编码、手机号——这些字段的内容绝大多数是 ASCII 数据。传统实现对所有字符一视同仁的做法,等于在大量的“轻量级”字符上执行了“重量级”的处理流程,白白消耗了大量 CPU 周期。这种冗余处理,是数据库排序和比较场景中一块隐蔽但可观的性能短板。
鲲鹏ARM SIMD:用向量化替代逐字循环
解决这个问题的钥匙,藏在鲲鹏处理器的硬件能力中。
鲲鹏处理器基于 ARM 架构,原生支持两套 SIMD 指令集——NEON(ARM 高级 SIMD 扩展)和 SVE(可伸缩向量扩展)。它们的核心思路很直接:一条指令,同时操作多份数据。
传统逐字符处理就好比一条单车道,一次只放行一辆车。SIMD 则相当于把这条路扩成了多车道高速——同样的时间窗口里,通行的数据量翻了十几倍。
● NEON:固定 128 位宽,单次处理 16 个字节,一条指令即可完成 16 个字符的判定或运算。
● SVE(鲲鹏差异化优势):支持 256 位宽(2×256bit)。相比市面上仅提供 128 位 SVE 的 ARM 处理器,鲲鹏单次能处理 32 个字节,吞吐直接翻倍。SVE 的向量宽度在运行时动态可探测,一套通用代码即可自动适配不同宽度的硬件——“可伸缩”的含义正在于此。
以处理 32 个 ASCII 字符为例,下图直观展示传统逐字符处理与 SIMD 批量处理的吞吐差距:传统标量需要 32 次循环迭代,NEON 仅需 2 次,SVE 一次搞定。

原本需要循环 16 次甚至 32 次的字符操作,现在被压缩为一条指令。当这个 16 倍、32 倍的加速作用于数百万行数据的排序、分组和哈希运算时,累积收益相当可观。
ARM SIMD 加速在 MySQL 框架中的位置
ARM SIMD 优化并非局限于某一个模块,而是覆盖了从 SQL 执行到存储引擎的多个关键路径。下图以四层子图全景呈现六个核心加速热点函数的位置,箭头标注了数据在各层之间的流转关系:

从图中可以清晰看到:
1. 加速点集中于 MySQL Server 层的字符集处理模块,横跨 SQL 执行与存储引擎之间的所有字符串操作路径
2. my_strnncoll(字符串比较) 是排序、分组、连接操作最终调用的底层函数,也是加速收益最大的单一热点
3. strnxfrm(排序键生成) 是 ORDER BY 的核心依赖,批量展开 ASCII 字符权重直接决定排序吞吐
4. my_hash_sort(哈希计算) 在 MEMORY 引擎和哈希分区场景中是关键路径,批量哈希更新大幅降低函数调用频率
5. SVE 256 位宽的物理寄存器在鲲鹏处理器上可直接利用,无需修改上层调用逻辑
三大优化策略,贯穿字符处理全链路
鲲鹏 BoostKit 字符集 SIMD 优化覆盖了 MySQL/Percona 中多个核心热点路径,涉及字符串比较、排序键生成、哈希计算、字符计数、大小写转换、通配匹配等高频操作。整体思路可以归纳为以下三条主线:

策略一:ASCII 批量处理——16/32 字节一步完成
这是整套优化的基石。传统实现遵循“逐字符解码→逐字符查表→逐字符映射→逐字符比较”的循环模式,每个字符独立走完一个完整周期。
鲲鹏 BoostKit 的改造思路是:在比较路径上,当数据以 ASCII 为主时,一次性加载一个向量块(NEON 16 字节或 SVE 32 字节),在这个块内批量完成 ASCII 判定、大小写归一化、权重映射和比较/哈希更新。
以哈希计算为例:在 MEMORY 引擎和哈希分区场景中,数据库需要对字符串计算排序哈希值。传统方式逐字符读取、逐个累加哈希状态,16 个字符就要调用 16 次哈希更新函数。SIMD 版本将这 16 个 ASCII 字符的权重一次性映射并累积到哈希状态中,调用频次降为原来的 1/16。排序键生成同理——ORDER BY 依赖的 strnxfrm 将 ASCII 字符批量展开为排序权重写入缓冲区,循环迭代次数大幅缩减。
策略二:智能空格跳过——PAD SPACE 比较的路径优化
utf8_general_ci、utf8_unicode_ci 等排序规则遵循 PAD SPACE 语义,即字符串尾部的空格不参与比较。传统实现在比较主循环中遇到空格时,需要逐个字节地检查后续是否也全是空格——一个字节一个字节地挪,在最坏情况下开销很大。
鲲鹏 BoostKit 引入了双指针同步跳过机制:当左右字符串的当前位置同时为空格时,加载 16 字节向量一次性检测是否为全空格块,直接跳过整段连续空格。在字符串包含大量对齐空格的业务场景中,这一优化效果尤为明显。
策略三:全路径覆盖与代码收敛——不给优化留盲区
除上述两大核心加速点外,鲲鹏 BoostKit 还对以下路径进行了系统性的 SIMD 改造:
● InnoDB 行格式写入中的尾部空格裁剪:将两处手写裁剪循环统一为复用 skip_trailing_space(),裁剪逻辑同步享受 SIMD 加速
● 字符数统计与位置定位(numchars / charpos):ASCII 前缀按向量宽度批量推进
● 合法 UTF8 前缀长度检查(well_formed_len):ASCII 段批量通过,跳过逐字节校验
● UCA 排序规则路径:utf8_unicode_ci、utf8mb4_unicode_ci 和 utf8mb4_0900_ai_ci 的可打印 ASCII 前缀加速
● 大小写转换:caseup / casedn 路径的 ASCII 段批量归一化
实测数据:在鲲鹏 920 服务器 8C16G 容器规格的 Percona-Server 5.7.44-53 环境中,记录匹配优化、字符集处理 SIMD 优化和非对齐内存访问优化三个特性叠加后,Sysbench 只读场景性能提升约 10%。

安全回退机制:能加速则加速,不能则原路
一个很自然的疑问:如果数据中混入了中文、日文、emoji,或者使用了自定义排序规则,这套 SIMD 加速会不会产生错误的比较结果?
答案是:不会。
下图展示 SIMD 快路径的完整决策流程——四级准入检查全部通过才进入批量处理,任一环节不满足即回退:

鲲鹏优化方案在每条快路径的入口都设置了多层守卫检查:
● 编译目标非 aarch64 → 不走快路径
● 运行时无 SVE 硬件支持 → 自动回退到 NEON 或标量路径
● 排序规则存在 tailoring 定制或 contraction 收缩字符(如匈牙利语的 cs、ch)→ 全量走原始逻辑
● 输入中出现非 ASCII 或不可打印字符 → 立即退出快路径
● 尾段不足一个向量宽度 → 不做部分写,回退到逐字节处理
无论数据多复杂、排序规则多特殊,优化前后的比较结果、排序顺序、哈希值完全一致。SIMD 只在“能加速的地方”出力,在“不能加速的位置”安静退让。对上层 SQL 和业务逻辑来说,这一切完全透明——不需要改一行应用代码,不需要调整任何 SQL 写法。
哪些业务场景最能受益
ARM SIMD 优化在 ASCII 数据占比高的场景中收益最集中。以下几类业务尤其值得关注:
电商搜索与推荐
商品名称、品牌名、SKU 编码的主体是 ASCII 字符。在商品池千万级的电商平台中,ORDER BY 排序和 LIKE 前缀匹配是每秒都在跑的高频操作。SIMD 批处理将字符串比较吞吐提升数倍,用户搜索响应更流畅,推荐排序更新更快。在大促峰值期间,这种加速能为系统挤出宝贵的 CPU 余量来应对流量洪峰。
金融交易系统
交易流水号、用户 ID、机构代码等字段以 ASCII 为主。交易监控、风控规则匹配、历史对账中密集的 GROUP BY 和哈希分区操作,受益于批量哈希计算与排序键生成的加速,CPU 占用明显下降,系统吞吐提升。在毫秒级响应的风控场景中,每一次排序和比较的加速都直接关系到规则的实时命中率。
用户中心与身份管理
用户名、邮箱、手机号是典型的 ASCII 字符串。登录校验、权限匹配、批量导入去重等场景频繁涉及字符串等值比较和排序。SIMD 快路径让 MEMORY 引擎的哈希查找和 B+ 树索引的比较效率显著提升。对拥有数亿注册用户的大型平台而言,每次登录验证节省的微秒级时间,放大到日均数十亿次调用上就是一笔可观的算力节约。
CRM 与客户数据平台
客户姓名(拼音/英文)、联系人信息、地址编码等大量使用 ASCII。客户分群、标签匹配、排序展示等操作在千万级客户数据上运行,SIMD 加速让数据处理响应时间更短,业务决策周期进一步缩短。
安装与启用
ARM SIMD 加速方案已作为鲲鹏 BoostKit 使能套件的一部分正式发布。以下是资源获取与安装指引。
表 1 硬件要求

表 2 操作系统和软件要求

安装步骤
将 MySQL 字符集优化特性 Patch 包合入 MySQL 源码并完成编译安装后即可使用。以 Percona-Server 8.0.43-34 为例:
1. 获取并解压 MySQL 源码,进入源码目录。MySQL 源码获取路径请参见表2 操作系统和软件要求。

2. 获取 MySQL 字符集优化特性 Patch 包并存放至服务器本地路径(例如 /home),patch 获取路径请参见表2 操作系统和软件要求。
3. 合入 Patch 包。

回显中无报错信息即表示 Patch 已成功应用。
4. 编译安装 MySQL。请参见《Percona移植指南》。
5. 在 MySQL 配置文件 /etc/my.cnf 中增加字符序配置。
1. 打开配置文件:
![]()
2. 按 i 进入编辑模式。
字符集为 utf8 时,在 [mysqld] 下增加以下配置:

字符集为 utf8mb4 时,在 [mysqld] 下增加以下配置:

3. 按 Esc 退出编辑模式,输入 :wq! 保存并退出。
4. 启动数据库。操作请参见《MySQL移植指南》的运行MySQL章节。
5. 以数据库 sbtest 中的表 sbtest1 为例,查询数据库和表的字符集、字符序配置:

说明:进入客户端的操作请参见《MySQL移植指南》的运行MySQL章节。
图 1 查询数据库字符集、字符序

图 2 查询表的字符集、字符序

图 3 获取数据库的表信息,collation列即为字符序

合入补丁、重新编译后,无需修改任何应用代码,SQL 查询自动享受 SIMD 加速。更多详细指导,请参见鲲鹏 BoostKit 字符集处理 SIMD 优化特性指南。
字符集比较——数据库中最不起眼却又无处不在的基础操作。鲲鹏 ARM SIMD 加速方案,用向量化批处理替代逐字符循环,充分释放每一条 SQL 背后的 CPU 算力。合入补丁,重新编译,即刻享受加速红利。
你的业务在数据库排序和字符比较上遇到过性能瓶颈吗?欢迎在评论区聊聊你的经验和见解。
「免责声明」:以上页面展示信息由第三方发布,目的在于传播更多信息,与本网站立场无关。我们不保证该信息(包括但不限于文字、数据及图表)全部或者部分内容的准确性、真实性、完整性、有效性、及时性、原创性等。相关信息并未经过本网站证实,不对您构成任何投资建议,据此操作,风险自担,以上网页呈现的图片均为自发上传,如发生图片侵权行为与我们无关,如有请直接微信联系g1002718958。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐



所有评论(0)