---
title: MySQL可插拔在线向量化分析引擎-官方技术文章-鲲鹏社区
description: 本文主要介绍如何在使用openEuler操作系统的鲲鹏服务器上部署并使用MySQL可插拔在线向量化分析引擎（以下简称KOVAE  ）提供的相关特性，并提供了使用KOVAE（Kunpeng Online Vectorized Analysis Engine）过程中遇到故障的解决方法。  为提升OLAP  （Online Analytical Processing）场景的性能，MySQL提供了第二执行
keywords: MySQL,可插拔在线向,量化分析引擎,官方技术文章,鲲鹏社区,介绍,软件架构,应用场景
url: https://www.hikunpeng.com/developer/techArticles/20250717-1?envFlag=1
section: (其他)
---

# MySQL可插拔在线向量化分析引擎-官方技术文章-鲲鹏社区

URL: https://www.hikunpeng.com/developer/techArticles/20250717-1?envFlag=1
描述: 本文主要介绍如何在使用openEuler操作系统的鲲鹏服务器上部署并使用MySQL可插拔在线向量化分析引擎（以下简称KOVAE  ）提供的相关特性，并提供了使用KOVAE（Kunpeng Online Vectorized Analysis Engine）过程中遇到故障的解决方法。  为提升OLAP  （Online Analytical Processing）场景的性能，MySQL提供了第二执行
关键词: MySQL,可插拔在线向,量化分析引擎,官方技术文章,鲲鹏社区,介绍,软件架构,应用场景

官方技术文章 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles)

MySQL可插拔在线向量化分析引擎

MySQL可插拔在线向量化分析引擎

原生开发

发表于 2025/07/17

0

作者 |  许荣荣

## 1. 介绍

### 软件架构

KOVAE是MySQL执行层的一个引擎，位于优化器层下方。KOVAE引擎使用MySQL插件接口，将符合并行条件的SQL过滤到KOVAE执行引擎中并行执行，更好地利用了鲲鹏服务器的多核优势，提高了SQL语句的执行性能。KOVAE在MySQL中的位置如图1-1所示。当优化器层制定执行计划后，KOVAE会判断是否需要交由MySQL执行器执行，或者由KOVAE自身执行。在某些情况下，KOVAE还可以将执行计划转回到MySQL执行器执行。图1-1 KOVAE在MySQL中的位置KOVAE的框架结构如图1-2所示。 MySQL插件接口：为MySQL第二引擎的标准接口，用于支持KOVAE的热安装、热卸载。 白名单控制：用于保证受支持的、有性能提升的执行计划才进入KOVAE执行。 执行计划适配器：用于将MySQL的执行计划转化为列存、批处理、可多线程并行执行的执行计划。 TableScan、Sort等各种并行执行算子：使算子可并行处理数据，详见表1-4，提升多核CPU的利用率，提升SQL语句的执行性能。 add、minus等各种表达式：实现了列存数据的批量处理，便于利用Arm服务器向量化的特性来提升SQL语句的执行性能。图1-2 KOVAE框架结构

### 应用场景

KOVAE适用于OLAP查询、大数据量和多核CPU支持的场景。此特性适用场景的必要条件如下： OLAP查询，不需要事务支持的场景。 查询的相关数据量应该较大，推荐数据量为大于10000行。 并行优势需要多核CPU支持，逻辑CPU核数应大于2。

### 原理描述

在配置KOVAE前，请先了解KOVAE系统的运行原理和内部执行过程。KOVAE通过优化SQL查询的执行计划，采用并行处理机制，并利用列存储结构的优势，实现了对SQL查询的高效处理。MySQL连接器接收到Client的SQL语句，经过解析器和优化器，生成查询的执行计划，根据规则，执行计划会被默认执行器执行或者被卸载到KOVAE上执行，执行完成后再将结果集返回到Client。SQL和执行的结果集的数据流向如图1-3所示。图1-3 KOVAE运行原理图

KOVAE内部执行过程概览如图1-4所示。图1-4 并行执行结构TableScan算子通过多个worker线程并行调用InnoDB读表的接口，将数据保存在TableScan算子的缓存队列中。TableScan上层算子（Agg/Sort/HashJoin/NestedLoopJoin等）从下层算子的数据缓存队列中拿取数据进行处理，每个算子都可以含有多个worker线程，多个worker线程并行处理可以充分利用ARM服务器的多核优势。图1-5 行存结构和列存结构MySQL InnoDB为行存结构，KOVAE数据为列存结构，对于指定某列进行运算处理时，由于列存结构上同列的数据在内存上是相邻的，所以数据处理更加高效。

## 2. 部署KOVAE

### 环境要求

KOVAE是以MySQL插件库形式使用，无法独立运行，需要在已安装MySQL 8.0.25版本的服务器上使用。

### 硬件要求

硬件要求如表1-1所示。表1-1 硬件要求

| 项目 | 说明 |
| --- | ---|
| 服务器 | 鲲鹏服务器 |
| 处理器 | 鲲鹏920系列处理器 |
| 硬盘 | 进行性能测试时，数据目录需使用单独硬盘，即一个系统盘，一个数据盘，至少两块硬盘。非性能测试时，直接在系统盘上建数据目录即可。具体硬盘数量根据实际需求配置。 |

操作系统和软件要求- 查看环境操作系统的信息：**cat /etc/\*-release**查看环境处理器相关信息：**lscpu**查看环境内核版本：**uname -r**查看环境信息：**uname -a**- 如果需要全新安装操作系统，可选择“Minimal Install”安装方式并勾选Development Tools套件，否则很多软件包需要手动安装。操作系统和软件要求如表1-2所示。表1-2 操作系统和软件要求

| 项目 | 版本 | 下载地址 |
| --- | --- | ---|
| 操作系统 | 20.03 LTS-SP1 for Arm | 获取链接 |
| 22.03 LTS-SP1 for Arm | 获取链接 |  |
| CMake | 3.5.2（openEuler 20.03） | 获取链接 |
| 3.11.4（openEuler 22.03） | openEuler 22.03默认自带CMake 3.11.4 |  |
| GCC | 7.3.0（openEuler 20.03） | 获取链接 |
| 10.3.1（openEuler 22.03） | openEuler 22.03默认自带GCC 10.3.1 |  |
| KAE | KAE1.0：使用kae1版本，仅支持内核版本为4.19的操作系统 | 获取链接 |
| KAE2.0：使用kae2.0.2版本，仅支持内核版本为5.10的操作系统 | KAE2.0源码包中包含了KAEzip模块，可以选择一键安装KAE的所有模块，或者选择单独安装KAEzip。获取链接 |  |
| BoostKit_Kovae_1.0.0.zip | - | 下载BoostKit_Kovae_1.0.0.zip文件并解压，得到ha_kovae.so文件。获取链接须知使用软件包前请先阅读《鲲鹏应用使能套件BoostKit用户许可协议 2.0》，如确认继续使用，则默认同意协议的条款和条件。 |
| MySQL | 8.0.25 | 获取链接 |

### 完整性校验

获取软件包后，需要校验软件包，确保与网站上原始的软件包一致。步骤 1 从企业网或鲲鹏社区获取对应的软件数字证书和软件安装包。步骤 2 获取校验工具和校验方法。步骤 3 参见2中下载的《OpenPGP签名验证指南》进行软件包完整性校验。

### 安装KAEzip

**安装KAEzip，以减少整个系统对磁盘空间的需求。**步骤 1 安装KAEzip。KAE源码包中包含了KAEzip模块，可以选择一键安装KAE的所有模块，或者选择单独安装KAEzip。详细操作步骤请参见《鲲鹏加速引擎 用户指南》，请严格按照该文档的操作指导，先完成安装前准备（准备安装环境和获取KAE的License），再安装KAEzip。步骤 2 创建软链接。`ln -s /usr/local/kaezip/lib/libz.so.1.2.11 /usr/local/kaezip/lib/libzkae.so`步骤 3 设置动态库加载路径。`export LD_LIBRARY_PATH=/usr/local/kaezip/lib:/usr/local/lib:$LD_LIBRARY_PATH`

### 安装KOVAE

支持通过修改配置文件my.cnf或通过MySQL客户端执行加载插件语句两种方式将KOVAE加载到MySQL服务中。其中通过修改配置文件的安装方式需要重启数据库才能生效。**操作步骤**步骤 1 获取KOVAE的压缩包BoostKit_Kovae_1.1.0.zip并解压，得到ha_kovae.so文件。下载链接请参见表2-2。步骤 2 通过MySQL客户端登录MySQL服务。步骤 3 在MySQL客户端语句查询，确认MySQL插件plugin_dir的存放路径。`show variables like "%plugin_dir%";`返回如下信息，“/usr/local/mysql-8.0.25/lib/plugin/”表示plugin_dir的存放路径。`+---------------+--------------------------------+``| Variable_name | Value |``+---------------+--------------------------------+``| plugin_dir | /usr/local/mysql-8.0.25/lib/plugin/ |``+---------------+--------------------------------+``1 row in set (0.00 sec)`步骤 4 将ha_kovae.so文件复制到MySQL插件的存放路径下。\1. 使用SFTP或SCP等工具将ha_kovae.so复制到plugin_dir所指的目录下，在本例中即“/usr/local/mysql-8.0.25/lib/plugin/”。\2. 复制完成后，使用SSH等终端工具登录服务器。\3. 在SSH终端上执行如下命令，查看plugin_dir目录下的ha_kovae.so文件。`ls /usr/local/mysql-8.0.25/lib/plugin/ha_kovae.so`返回ha_kovae.so文件信息如下。`/usr/local/mysql-8.0.25/lib/plugin/ha_kovae.so`步骤 5 将ha_kovae.so赋予可执行权限。`chmod 755 /usr/local/mysql-8.0.25/lib/plugin/ha_kovae.so`查看已设置ha_kovae.so文件的权限。`ll /usr/local/mysql-8.0.25/lib/plugin/ha_kovae.so`返回如下信息，可以看到已设置ha_kovae.so文件的权限为-rwxr-xr-x。`-rwxr-xr-x 1 root root 1839816 May 16 17:00 /usr/local/mysql-8.0.25/lib/plugin/ha_kovae.so`步骤 6 将ha_kovae.so插件加载到MySQL服务中。kovae插件支持两种安装方法。为阻止缓冲区溢出攻击，建议使用ASLR（Address space layout randomization）技术，通过堆、栈、共享库映射等线性区布局的随机化，增加攻击者预测目的地址的难度，防止攻击者直接定位攻击代码位置。该技术可作用于堆、栈、内存映射区（mmap基址、shared libraries、vdso页）。开启ASLR的命令如下：`echo 2 > /proc/sys/kernel/randomize_va_space` 方法一：自动加载安装插件。在my.cnf文件中的[mysqld]配置段下增加配置行，此方式需要重启数据库后才能生效。例如：`plugin-load-add=ha_kovae.so` 方法二：手动加载安装插件。a. 通过MySQL客户端登录MySQL服务。b. 安装ha_kovae.so插件。`install plugin kovae soname "ha_kovae.so";`语句返回如下信息，表示操作成功。`Query OK, 0 rows affected (0.01 sec)`

### 使能KOVAE

安装KOVAE完成后，还需要在数据库中使能KOVAE，并确保目标表相关的SQL在KOVAE中执行。本章节以测试表t1为例进行说明。**操作步骤**步骤 1 通过MySQL客户端登录MySQL服务。例如：`mysql -uroot -p -S /data/mysql/run/mysql.sock`“/data/mysql/run/mysql.sock”文件的路径，请根据实际情况修改。步骤 2 在MySQL客户端执行如下语句，将目标表的第二引擎设置为KOVAE。每个表只需操作一次，重启MySQL服务后不需要重新设置。t1为目标表的名称，请根据实际情况填写。`ALTER TABLE t1 SECONDARY_ENGINE = kovae;`返回如下信息，表示操作成功。`Query OK, 0 rows affected (0.01 sec)``Records: 0 Duplicates: 0 Warnings: 0`步骤 3 查看表的第二引擎设置信息。t1为目标表的名称，请根据实际情况填写。`show create table t1;`查看到目标表的创建信息中新增了“SECONDARY_ENGINE=kovae”的信息，表示操作成功。`+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+``| Table | Create Table |``+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+``| t1 | CREATE TABLE `t1` (```a` int DEFAULT NULL,```b` int DEFAULT NULL``) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci SECONDARY_ENGINE=kovae |``+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+``1 row in set (0.00 sec)`步骤 4 将目标表加载到KOVAE中，才能使目标表相关的SQL在KOVAE中执行。t1为目标表的名称，请根据实际情况填写。每个表只需操作一次，重启MySQL服务后需要重新将目标表加载到KOVAE中。`ALTER TABLE t1 SECONDARY_LOAD;`返回如下信息，表示操作成功。`Query OK, 0 rows affected (0.00 sec)`2.6 验证KOVAE将目标表的第二引擎设置为KOVAE后，通过以下步骤验证KOVAE是否可以使用。本章节以测试表t1为例进行说明。操作步骤步骤 1 通过MySQL客户端登录MySQL服务。步骤 2 在MySQL客户端执行如下语句，设置连接字符集。`set character_set_connection=utf8mb4;`返回如下信息，表示操作成功。`Query OK, 0 rows affected (0.00 sec)`查看设置连接字符集是否成功。`show variables like "%character_set_connection%";`设置连接字符集成功预期结果：`+--------------------------+---------+``| Variable_name | Value |``+--------------------------+---------+``| character_set_connection | utf8mb4 |``+--------------------------+---------+``1 row in set (0.00 sec)`步骤 3 将测试表设置KOVAE为第二引擎后，执行如下命令load该表。t1为目标表的名称，请根据实际情况填写。`ALTER TABLE t1 SECONDARY_LOAD;`返回如下信息，表示操作成功。`Query OK, 0 rows affected (0.00 sec)`步骤 4 将secondary_engine_cost_threshold设置为0，确保SQL语句可以进入第二引擎。`set secondary_engine_cost_threshold=0;`返回如下信息，表示操作成功。`Query OK, 0 rows affected (0.00 sec)`\1. 查看当前KOVAE的状态变量的统计值。`show status like '%kovae%';`预期结果：`+-------------------------------+-------+``| Variable_name | Value |``+-------------------------------+-------+``| kovae_enter_times | 0 |``| kovae_execution_times | 0 |``| kovae_execution_succeed_times | 0 |``+-------------------------------+-------+``3 rows in set (0.00 sec)`\2. 查询表t1上的所有数据。`select * from t1;`预期结果：`+------+------+``| a | b |``+------+------+``| 1 | 2 |``| 2 | 3 |``+------+------+``2 rows in set (0.01 sec)`\3. 执行如下命令查看当前KOVAE状态变量更新后的统计值。`show status like '%kovae%';`最终看到kovae_execution_succeed_times的值已更新，即表示SQL语句进入了KOVAE，并在KOVAE中执行成功。`+-------------------------------+-------+``| Variable_name | Value |``+-------------------------------+-------+``| kovae_enter_times | 1 |``| kovae_execution_times | 1 |``| kovae_execution_succeed_times | 1 |``+-------------------------------+-------+``3 rows in set (0.00 sec)`

### 卸载KOVAE

卸载KOVAE操作步骤仅用于指导用户不再需要使用KOVAE时参考。卸载KOVAE前，必须将所有KOVAE的第二引擎表修改为卸载状态。本章节以测试表t1为例进行说明。关于MySQL标准插件配置及操作的更多详细信息，请参见安装和卸载插件。**操作步骤**步骤 1 通过MySQL客户端登录MySQL服务。步骤 2 卸载所有第二引擎为KOVAE的表。t1为目标表的名称，请根据实际情况填写。如果需要卸载多个表，需要对目标卸载表逐一执行卸载表的SQL。`ALTER TABLE t1 SECONDARY_UNLOAD;`返回如下信息，表示操作成功。`Query OK, 0 rows affected (0.00 sec)`步骤 3 将第二引擎为KOVAE的表的第二引擎设置为null。t1为目标表的名称，请根据实际情况填写。`ALTER TABLE t1 SECONDARY_ENGINE = null;`返回如下信息，表示操作成功。`Query OK, 0 rows affected (0.01 sec)``Records: 0 Duplicates: 0 Warnings: 0`步骤 4 执行如下语句，卸载KOVAE。`uninstall plugin kovae;`返回如下信息，表示操作成功。`Query OK, 0 rows affected (0.32 sec)`

## 3. 特性使用

### 设置和清除数据表的第二引擎属性

设置和清除数据表的第二引擎属性要求操作用户具有修改数据表权限。卸载第二引擎时或数据表管理维护的时候，可能会涉及设置数据表的第二引擎属性。本章节以测试表t1为例进行说明。**设置数据表的第二引擎属性**步骤 1 通过MySQL客户端登录MySQL服务。步骤 2 将数据表的第二引擎设置为KOVAE。t1为目标表的名称，请根据实际情况填写。`ALTER TABLE t1 SECONDARY_ENGINE = kovae;`返回如下信息，表示操作成功。`Query OK, 0 rows affected (0.01 sec)``Records: 0 Duplicates: 0 Warnings: 0`**清除数据表的第二引擎属性**步骤 1 通过MySQL客户端登录MySQL服务。步骤 2 将数据表的第二引擎设置信息清除。t1为目标表的名称，请根据实际情况填写。`ALTER TABLE t1 SECONDARY_ENGINE = null;`返回如下信息，表示操作成功。`Query OK, 0 rows affected (0.01 sec)``Records: 0 Duplicates: 0 Warnings: 0`

### 第二引擎上加载和卸载数据表

将数据表加载到第二引擎，是该表相关SQL语句卸载到KOVAE上执行的前提条件。卸载KOVAE前，需要执行本操作将所有KOVAE的第二引擎表修改为卸载状态。在第二引擎上加载和卸载数据表要求操作用户具有修改数据表权限。本章节以测试表t1为例进行说明。**将数据表加载到第二引擎**步骤 1 通过MySQL客户端登录MySQL服务。步骤 2 将数据表加载到第二引擎。t1为目标表的名称，请根据实际情况填写。`ALTER TABLE t1 SECONDARY_LOAD;`返回如下信息，表示操作成功。`Query OK, 0 rows affected (0.00 sec)`**将数据表从第二引擎上卸载**步骤 1 通过MySQL客户端登录MySQL服务。步骤 2 将数据表从第二引擎卸载。t1为目标表的名称，请根据实际情况填写。`ALTER TABLE t1 SECONDARY_UNLOAD;`返回如下信息，表示操作成功。`Query OK, 0 rows affected (0.00 sec)`设置语句是否进入第二引擎执行您可以通过加hint改写SQL语句、设置查询成本阈值或通过白名单过滤三个方面来设置语句是否进入第二引擎执行。**通过加hint改写SQL语句**针对某个SQL语句，可通过加hint的方式，强制进入第二引擎，或强制不进入第二引擎。步骤 1 通过MySQL客户端登录MySQL服务。步骤 2 设置语句是否进入第二引擎执行。 强制进入第二引擎。`SELECT /*+ SET_VAR(use_secondary_engine = FORCED) */ ... FROM ...` 强制不进入第二引擎。`SELECT /*+ SET_VAR(use_secondary_engine = OFF) */ ... FROM ...`**设置查询成本阈值**步骤 1 通过MySQL客户端登录MySQL服务。步骤 2 设置查询成本阈值。set secondary_engine_cost_threshold=成本阈值;例如，如下语句中显示该select语句的cost为0.35。将secondary_engine_cost_threshold设置为小于0.35的值（例如0.1）后，该语句即可进入KOVAE中进行白名单过滤，过滤通过后即可在KOVAE中执行。`explain format=tree select * from t1;``+------------------------------------------+``| EXPLAIN |``+------------------------------------------+``| -> Table scan on t1 (cost=0.35 rows=1) |``+------------------------------------------+``1 row in set (0.00 sec)`设置并查询KOVAE相关参数和查询状态变量您可以通过数据库启动命令行方式、通过配置文件方式或在MySQL运行时动态修改三种方式来配置KOVAE相关参数。KOVAE插件新增了三个状态变量，包括kovae_enter_times、kovae_execution_times和kovae_execution_succeed_times，用于查看KOVAE相关的统计数据。**设置和查询KOVAE相关参数**KOVAE相关参数及其说明如表3-1所示。表3-1 KOVAE相关参数及其说明

| 参数名称 | 是否支持启动命令行参数 | 是否支持启动配置文件 | 是否支持运行时动态修改 | 作用范围 | 类型 | 默认值 | 取值范围 | 参数说明 |
| --- | --- | --- | --- | --- | --- | --- | --- | ---|
| secondary_engine_cost_threshold | 是 | 是 | 是 | Global | double | 100000 | 0～DBL_MAX (maximum double value) | 用于查询使用第二引擎的代价阈值。在代价大于该值时，将尝试使用第二引擎执行查询。 |
| innodb_parallel_read_threads | 是 | 是 | 是 | Session | unsigned long | 4 | 1～256 | 并行读表的线程数。 |
| kovae_aggregator_hash_type | 是 | 是 | 是 | Session | unsigned int | 0 | 0和1 | Agg算子hash分组时的工作模式。l  0表示所有worker线程共用一个hash表。l  1表示每个worker线程使用各自的hash表。当被分组记录数非常多，分组结果记录数很少时，模式1有明显提升效果。当被分组记录数非常多，分组结果记录也非常多（分组结果记录数比本查询的并行线程数大几个数量级）时，应使用模式0。 |
| kovae_hashjoin_batch_num | 是 | 是 | 是 | Session | unsigned long | 1024 | 128～4096 | hash表分区数量最大值。 |
| kovae_log_level | 是 | 是 | 是 | Global | unsigned int | 2 | 1～5 | 日志输出级别。各个日志级别与对应数值：l  ERR：1l  WARNING：2l  NOTICE：3l  INFO：4l  DEBUG：5设置了日志输出级别后，会在MySQL的error log日志文件中输出小于或等于该配置值的日志级别的日志记录。 |
| kovae_memory_buffer_size | 是 | 是 | 是 | Session | unsigned longlong | 1073741824 | 268435456~264-1（maximum unsigned long long value） | 如果排序、聚合、hashjoin和物化算子使用的内存量超过了该配置值的字节数，将触发落盘流程，以降低内存的使用量，但可能会影响性能。 |
| kovae_memory_control | 是 | 是 | 是 | Global | bool | 0 | 0和1 | 内存控制功能的总开关。当设置为时，并行查询的内存申请尽量从操作系统申请；当设置为开启时，所有并行查询可申请使用的内存量将受kovae_memory_max_size配置值的控制，所有并行查询从OS申请使用内存的操作将被统计和监控。 |
| kovae_memory_max_size | 是 | 是 | 是 | Global | longlong | 10*2^30 | 230~263-1(maximum long long value) | 并行查询可以申请的内存总量。开启kovae_memory_control后，kovae_memory_max_size的配置值才能生效。当所有查询语句总共申请的内存字节数超过了设置的kovae_memory_max_size值时，系统将无法继续进行并行查询流程，并且可能会导致内存申请失败。在这种情况下，查询流程将自动退出。说明内存控制非严格字节数的控制，存在一定误差。内存控制的精度受到并行查询的并行数和算子的影响，kovae_memory_max_size的配置值应该小于可用内存，以保留一定的预留余量。 |
| kovae_memory_save_num | 是 | 是 | 是 | Global | unsigned int | 100 | 0~1000 | 用于设置information_schema.KOVAE_MEMORY_HISTORY表可缓存的最近的并行查询记录数。当开启并行查询的内存控制功能后，您可以通过查询information_schema.KOVAE_MEMORY_HISTORY表来查看历史查询的内存使用信息记录。 |
| kovae_serial_mode | 是 | 是 | 是 | Global | bool | 0 | 0和1 | 用于控制串行模式的开关。开启后，系统将限制查询操作只能单独执行一条SQL语句。 |
| kovae_threadpool_size | 是 | 是 | 是 | Global | unsigned int | CPU的核数，若核数获取失败则为1 | 1~65535 | 线程池中最大可保留的线程数。所有并行查询的工作线程都从线程池中申请，当线程池中的线程数被申请完，新的线程申请将受到kovae_threadpool_stalltime参数的限制。当已申请的线程数达到kovae_threadpool_size后，新的线程要间隔kovae_threadpool_stalltime时间后才能申请成功。kovae_threadpool_size一般可设置为可用CPU核数的3～5倍。 |
| kovae_parallel_threads | 是 | 是 | 是 | Session | unsigned int | 2 | 1~1000 | 单个并行查询可申请的最大工作线程数。kovae_parallel_threads一般可设置为kovae_threadpool_size/大概率同时执行的并行查询数会话数的值。 |
| kovae_threadpool_stalltime | 是 | 是 | 是 | Global | unsigned int | 1800 | 0~232-1（maximum unsigned int value） | 当线程池中的线程全被申请以至于没有空闲线程时，新的查询将无法获得可用的工作线程。为了避免过多的线程创建和资源浪费，设置一个等待时间kovae_threadpool_stalltime，当两次申请失败的时间超过了该等待时间（单位秒），才会扩展新的工作线程，以提供给新的并行查询使用。kovae_threadpool_stalltime可保持默认值。 |
| kovae_statement_history_schema_size | 是 | 是 | 否 | Global | unsigned longlong | 10000 | 100~263-1(maximum long long value) | INFORMATION_SCHEMA.KOVAE_STATEMENT_HISTORY表的最大缓存行数，记录的缓存在KOVAE插件加载时申请分配，在KOVAE卸载时释放。 |
| kovae_threads_history_schema_size | 是 | 是 | 否 | Global | unsigned longlong | 100000 | 10000~263-1(maximum long long value) | INFORMATION_SCHEMA.KOVAE_THREADS_HISTORY表的最大缓存行数，记录的缓存在KOVAE插件加载时申请分配，在KOVAE卸载时释放。 |
| kovae_memory_detail_history_schema_size | 是 | 是 | 否 | Global | unsigned longlong | 1000000 | 10000~263-1(maximum long long value) | INFORMATION_SCHEMA.KOVAE_MEMORY_DETAIL_HISTORY表的最大缓存行数，记录的缓存在KOVAE插件加载时申请分配，在KOVAE卸载时释放。 |
| kovae_buffer_detail_history_schema_size | 是 | 是 | 否 | Global | unsigned longlong | 1000000 | 10000~263-1(maximum long long value) | INFORMATION_SCHEMA.KOVAE_BUFFER_DETAIL_HISTORY表的最大缓存行数，记录的缓存在KOVAE插件加载时申请分配，在KOVAE卸载时释放。 |
| kovae_memory_detail_rowadapter | 是 | 是 | 是 | Global | bool | false | true和false | rowadapter算子是否做内存申请释放的信息统计。若开启统计，则对算子性能有略微劣化影响。 |
| kovae_memory_detail_tablescan | 是 | 是 | 是 | Global | bool | false | true和false | tablescan算子是否做内存申请释放的信息统计。 |
| kovae_memory_detail_indexrangescan | 是 | 是 | 是 | Global | bool | false | true和false | index range scan算子是否做内存申请释放的信息统计。 |
| kovae_memory_detail_indexscan | 是 | 是 | 是 | Global | bool | false | true和false | index scan算子是否做内存申请释放的信息统计。 |
| kovae_memory_detail_agg | 是 | 是 | 是 | Global | bool | false | true和false | agg算子是否做内存申请释放的信息统计。 |
| kovae_memory_detail_material | 是 | 是 | 是 | Global | bool | false | true和false | materialize算子是否做内存申请释放的信息统计。 |
| kovae_memory_detail_sort | 是 | 是 | 是 | Global | bool | false | true和false | sort算子是否做内存申请释放的信息统计。 |
| kovae_memory_detail_hashjoin | 是 | 是 | 是 | Global | bool | false | true和false | hashjoin算子是否做内存申请释放的信息统计。 |
| kovae_memory_detail_limit | 是 | 是 | 是 | Global | bool | false | true和false | limit算子是否做内存申请释放的信息统计。 |
| kovae_memory_detail_nestedloopjoin | 是 | 是 | 是 | Global | bool | false | true和false | nestedloopjoin算子是否做内存申请释放的信息统计。 |
| kovae_memory_detail_streaming | 是 | 是 | 是 | Global | bool | false | true和false | streaming算子是否做内存申请释放的信息统计。 |
| kovae_buffer_view_tablescan | 是 | 是 | 是 | Global | bool | false | true和false | table scan算子是否做缓存占用释放的信息统计。 |
| kovae_buffer_view_agg | 是 | 是 | 是 | Global | bool | false | true和false | agg算子是否做缓存占用释放的信息统计。 |
| kovae_buffer_view_sort | 是 | 是 | 是 | Global | bool | false | true和false | sort算子是否做缓存占用释放的信息统计。 |
| kovae_buffer_view_hashjoin | 是 | 是 | 是 | Global | bool | false | true和false | hashjoin算子是否做缓存占用释放的信息统计。 |
| kovae_buffer_view_material | 是 | 是 | 是 | Global | bool | false | true和false | materialize算子是否做缓存占用释放的信息统计。 |

步骤 1 通过MySQL客户端登录MySQL服务。步骤 2 执行如下命令，设置KOVAE相关参数。set variable 参数名=参数值;set global variable 参数名=参数值;步骤 3 执行如下命令，查看已设置的KOVAE相关参数。show variables like "%参数名%";**查询状态变量**KOVAE插件新增了如表3-2所示的3个状态变量，用于查看KOVAE相关的统计数据。表3-2 状态变量名及其说明

| 状态变量名 | 说明 |
| --- | ---|
| kovae_enter_times | 进入KOVAE引擎的SQL语句个数。 |
| kovae_execution_times | 通过白名单控制过滤，在KOVAE引擎执行的SQL语句个数。 |
| kovae_execution_succeed_times | 在KOVAE引擎执行完成的SQL语句个数。 |

步骤 1 通过MySQL客户端登录MySQL服务。步骤 2 执行如下命令，查询状态变量值。show status like "%状态变量名%";

### 设置内存控制

在同时并行查询数较多、可用内存较少的情况下，为避免查询容易出现OOM（Out of Memory）的问题导致数据库崩溃，可使用内存控制功能，降低OOM的风险。与并行查询内存控制相关的参数名称如下，其参数说明请参见3.4 设置并查询KOVAE相关参数和查询状态变量。 kovae_memory_control kovae_memory_max_size kovae_memory_save_num**操作步骤**步骤 1 通过MySQL客户端登录MySQL服务。步骤 2 设置KOVAE相关参数。set variable 参数名=参数值;set global variable 参数名=参数值;步骤 3 查看已配置的参数。show variables like "%参数名%";

### 设置第二引擎算子并行数

当可用CPU核数的利用率不够高时，如果想要提升并行查询的性能，可适当调整算子并行数参数。与算子并行数相关的参数名称如下，其参数说明请参见3.4 设置并查询KOVAE相关参数和查询状态变量。 innodb_parallel_read_threads kovae_threadpool_size kovae_parallel_threads kovae_threadpool_stalltime**操作步骤**步骤 1 通过MySQL客户端登录MySQL服务。步骤 2 设置KOVAE相关参数。set variable 参数名=参数值;set global variable 参数名=参数值;步骤 3 查看已配置的参数。show variables like "%参数名%";

### 设置算子缓存落盘

当Agg、HashJoin、Sort和Materialize算子的缓存数据量比较大时，可以调整算子缓存落盘相关的参数，提升并行查询的成功率。KOVAE的默认磁盘缓存文件目录为“tmpdir”参数的配置值所显示的目录，该参数只能通过配置文件或通过修改MySQL服务命令行参数来配置，不允许在MySQL运行时动态修改。KOVAE有Agg、HashJoin、Sort和Materialize四个算子，支持缓存超配置值触发缓存落盘的机制。与算子缓存落盘触发相关的阈值配置参数为kovae_memory_buffer_size，其参数说明请参见3.4 设置并查询KOVAE相关参数和查询状态变量。**操作步骤**步骤 1 通过MySQL客户端登录MySQL服务。步骤 2 设置KOVAE相关参数。set variable 参数名=参数值;set global variable 参数名=参数值;步骤 3 查看已配置的参数。show variables like "%参数名%";

### 查看第二引擎执行SQL次数的统计

如果需要查看第二引擎在查询中的成功率，可通过查看kovae_enter_times、kovae_execution_times和kovae_execution_succeed_times三个状态变量来了解。与第二引擎执行SQL次数的统计相关的状态变量如下，其参数说明请参见3.4 设置并查询KOVAE相关参数和查询状态变量。 kovae_enter_times kovae_execution_times kovae_execution_succeed_times当有SQL语句被白名单过滤不通过时，会出现kovae_enter_times > kovae_execution_times的情况。当出现SQL语句在KOVAE中执行失败时，会出现kovae_execution_times > KOVAE_execution_succeed_times的情况。**操作步骤**步骤 1 通过MySQL客户端登录MySQL服务。步骤 2 查询状态变量值。show status like "%状态变量名%";

## 4 特性调优

可以通过调整KOVAE的参数配置，有效提升服务器性能。下文提供内存参数、线程参数和hash参数的调优建议，如表4-1、表4-2和表4-3所示。表4-1 内存参数调优建议

| 参数名称 | 参数含义 | 优化建议 |
| --- | --- | ---|
| kovae_memory_max_size | 当开启内存控制，该参数设置越大，就可以支持更多的并行查询和可以设置更大的kovae_memory_buffer_size。 | 当内存充裕时，建议设置更大的kovae_memory_max_size值。 |
| kovae_memory_buffer_size | 当查询存在落盘算子（排序、聚合、hashjoin、物化）且查询表的数据量大的时候，该参数会对性能产生严重的影响。 | 该参数设置越大性能越好，但当没有开启内存控制时，该参数设置过大可能会触发OOM，当开启内存控制时，该参数设置过大可能会触发内存不足导致查询失败，建议设置为KOVAE最大可用内存的十分之一。 |
| kovae_serial_mode | 当开启内存控制，且只有一个客户端在执行查询时，可以通过开启串行模式来提高查询性能。 | 开启串行模式后，KOVAE会自动调节落盘算子的缓存大小，尽量减少数据落盘。 |

表4-2 线程参数调优建议

| 参数名称 | 参数含义 | 优化建议 |
| --- | --- | ---|
| kovae_threadpool_size | 线程池中最大可保留的线程数。 | 建议设置为可用CPU核数的3～5倍。 |
| kovae_parallel_threads | 单个并行查询可申请的最大工作线程数。 | 默认值为2，当会话数很少时（即会话数小于5时），建议设置为可用CPU核数。一般可设置为kovae_threadpool_size/大概率同时执行的并行查询数会话数的值。 |
| kovae_threadpool_stalltime | 当线程使用达到上限时，该值越小总体性能越好，但新的查询请求会等待更久，出现饿死情况。 | 当追求总体性能时，可以调低kovae_threadpool_stalltime值。 |
| innodb_parallel_read_threads | 并行读表的线程数。 | 当会话数少时，可以通过提高该值来加快查询速度，建议设置为可用CPU核数/大概率同时执行的并行查询数会话数的值。 |

表4-3 hash参数调优建议

| 参数名称 | 参数含义 | 优化建议 |
| --- | --- | ---|
| kovae_aggregator_hash_type | Agg算子hash分组时的工作模式。 | 当group by的列的分组数很少时，将kovae_aggregator_hash_type的参数值设置为1可以提高查询速度。 |

表4-4 典型配置（以鲲鹏920 7265处理器 + 512GB内存 + 1TB硬盘为例）

| 参数 | 典型配置值 | 推荐配置说明 |
| --- | --- | ---|
| kovae_threadpool_size | 256 | 设置为CPU core数的2倍，例如鲲鹏920 7265处理器2P服务器场景下，设置为128core * 2 = 256。 |
| kovae_parallel_threads | 64 | 设置为kovae_threadpool_size / 连接数的值。以一般OLAP场景下4个连接数为例，则设置为kovae_threadpool_size / 4 = 64。 |
| innodb_parallel_read_threads | 32 | 设置为CPU core数 / 连接数的值。以一般AP场景下4个连接数为例，则设置为128 / 4 = 32。 |
| kovae_memory_max_size | 200*1024*1024*1024，即200GB | 设置约束关系为MySQL innodb_buffer_pool_size + kovae_memory_max_size <= 物理机内存的70%。例如，物理机512GB内存*70%为358.4GB，100GB的TPC-H库的innodb_buffer_pool_size的典型设置值为150GB，得到kovae_memory_max_size的典型设置值为200GB。 |
| kovae_memory_buffer_size | 20*1024*1024*1024，即20GB | 推荐设置为kovae_memory_max_size的10%。 |
| 其他参数 | 默认即可 | - |

## A 缩略语

| 缩略语 | 英文全称 | 中文全称 |
| --- | --- | ---|
| KAE | Kunpeng Accelerator Engine | 鲲鹏加速引擎 |
| KOVAE | kunpeng Online Vectorized Analysis Engine | 可插拔在线向量化分析引擎 |
| OLAP | Online Analytical Processing | 在线分析处理 |
| OOM | Out of Memory | 内存不足 |

本页内容
