CREATE INDEX USING HNSW

MatrixOne 在向量检索功能中支持使用 HNSW(Hierarchical Navigable Small World)算法来加速高维向量的相似度搜索。

语法说明

MatrixOne 在向量检索功能中支持使用 HNSW(Hierarchical Navigable Small World)算法来加速高维向量的相似度搜索。

语法结构

> CREATE INDEX index_name
USING HNSW
ON tbl_name (col,...)
OP_TYPE "vector_l2_ops"
[M <n>]
[EF_CONSTRUCTION <n>]  
[EF_SEARCH <n>] ;

语法释义

  • index_name:索引名称

  • HNSW:向量索引类型

  • OP_TYPE:要使用的距离度量,目前支持 vector_l2_ops

  • M:默认值为 16,控制 HNSW 图中每个节点连接的最大邻居数,默认是 16。值越大,索引质量越好但构建时间和存储开销越大。

  • EF_CONSTRUCTION - 默认值为 128,构建索引时的扩展因子,控制构图时的探索宽度。默认是 128。

  • EF_SEARCH - 默认值为 64,查询时的扩展因子,控制搜索过程中访问的候选节点数量。

示例

--需设置参数 experimental_ivf_index 值为 1(默认 0)才能使用向量索引
SET GLOBAL experimental_hnsw_index = 1;
drop table if exists t1;

create table vector_index_02(a bigint primary key, b vecf32(3),c int);
insert into vector_index_02 values(1 ,"[1, 0, 1]",3);
create index idx01 using hnsw on vector_index_02(b) op_type "vector_l2_ops" M 48 EF_CONSTRUCTION 64 EF_SEARCH 64;
mysql> show create table vector_index_02;
+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table           | Create Table                                                                                                                                                                                                                               |
+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| vector_index_02 | CREATE TABLE `vector_index_02` (
  `a` bigint NOT NULL,
  `b` vecf32(3) DEFAULT NULL,
  `c` int DEFAULT NULL,
  PRIMARY KEY (`a`),
  KEY `idx01` USING hnsw (`b`) m = 48  ef_construction = 64  ef_search = 64  op_type 'vector_l2_ops' 
) |
+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> desc vector_index_02;
+-------+------------+------+------+---------+-------+---------+
| Field | Type       | Null | Key  | Default | Extra | Comment |
+-------+------------+------+------+---------+-------+---------+
| a     | BIGINT(64) | NO   | PRI  | NULL    |       |         |
| b     | VECF32(3)  | YES  | MUL  | NULL    |       |         |
| c     | INT(32)    | YES  |      | NULL    |       |         |
+-------+------------+------+------+---------+-------+---------+
3 rows in set (0.03 sec)

插件框架

MatrixOne 中的向量索引类型(包括 HNSW 和 IVFFLAT)通过可插拔的索引插件框架实现。每种索引算法以插件的形式注册,提供以下生命周期钩子:

  • 实验性标志门控:每个插件定义 ExperimentalFlag 钩子来控制该索引类型是否可用于创建。对于 HNSW,设置 experimental_hnsw_index = 1 启用插件。当标志为 0(默认值)时,尝试创建 HNSW 索引会失败并报错。

  • 目录注册:索引创建成功后,插件会将其算法名称和隐藏表类型写入 mo_catalog.mo_indexes,允许通过元数据查询发现已注册的索引及其内部状态。

  • 调度路径CREATE INDEX ... USING hnsw 会调度到 HNSW 插件,该插件处理索引构建、序列化和查询时扫描。

  • 往返可见性:索引定义保留在 SHOW CREATE TABLE 输出中,确保可以从表的 DDL 重建索引。

这种插件架构支持集成第三方或自定义向量索引实现,每个插件独立管理自己的构建参数、存储布局和搜索逻辑。

限制

  • 需要将 bigint 主键作为主键

  • 仅支持 vecf32 向量类型,不支持 vecf64 向量类型