跳转到主要内容

Native Vector Search

AliSQL 在 MySQL / InnoDB 中增加 VECTOR(N) 类型、欧氏距离和余弦距离函数,以及 HNSW 近似最近邻索引。当前实现最多支持 16,383 维的向量。

AliSQL Vector Index:InnoDB 向量列、HNSW 索引构建、标量过滤、近似最近邻搜索与 Top K 输出

存储与查询路径

HNSW 图以结构化 InnoDB 辅助表的形式持久化。每个图节点由一行表示,包含所在层、基础表引用、量化向量和邻居。基础表与辅助表的元数据参与 MySQL 8.0 数据字典和 DDL 事务。

查询时,AliSQL 可以基于代价选择向量索引,也可以通过 FORCE INDEX 等提示指定索引。图节点通过两类生命周期不同的缓存加载:

  • MHNSW Share 由只读事务共享,避免反复加载同一批可见节点。
  • MHNSW Trx 属于读写事务,隔离已修改的节点,并在提交时更新共享缓存视图。

因此,Vector Index 仍由 InnoDB 事务管理,并不是独立的外部索引。

启用并创建索引

向量功能默认关闭。使用索引的向量操作要求 READ COMMITTED

SET GLOBAL vidx_disabled = OFF;
SET SESSION transaction_isolation = 'READ-COMMITTED';

CREATE TABLE documents (
id BIGINT PRIMARY KEY,
title VARCHAR(200),
embedding VECTOR(3),
VECTOR INDEX embedding_hnsw (embedding) M=6 DISTANCE=COSINE
) ENGINE=InnoDB;

INSERT INTO documents VALUES
(1, 'Storage engine notes', VEC_FROMTEXT('[0.1,0.2,0.3]')),
(2, 'Recovery design', VEC_FROMTEXT('[0.2,0.1,0.4]'));

使用索引距离查询最近邻:

SELECT id,
title,
VEC_DISTANCE(
embedding,
VEC_FROMTEXT('[0.1,0.2,0.3]')
) AS distance
FROM documents
ORDER BY distance
LIMIT 10;

如果需要显式指定距离函数,还可以使用 VEC_DISTANCE_EUCLIDEANVEC_DISTANCE_COSINE

HNSW 参数

变量或索引选项作用域默认值文档记录的范围或取值
vidx_disabled全局ONONOFF
vidx_default_distance全局、会话EUCLIDEANEUCLIDEANCOSINE
vidx_hnsw_default_m / M全局、会话 / 索引63 到 200
vidx_hnsw_ef_search全局、会话201 到 10000
vidx_hnsw_cache_size全局16 MiB1 MiB 到 ULLONG_MAX 字节

M 会影响图的连接性,ef_search 会影响搜索宽度,缓存上限则决定内存中可保留多少图数据。这三个参数都需要结合实际负载调优,并同时测量召回率、延迟、构建成本和内存使用量。

事务与 DDL 限制

  • 向量索引只支持 InnoDB 表。
  • 向量索引操作要求 READ COMMITTED
  • 支持并发读取以及读写并发;当前不支持对同一向量表并发写入。
  • 创建、修改或删除向量索引不能使用 ALGORITHM=INPLACE
  • 向量索引不能设置为 INVISIBLE
  • 查询向量的维度必须与索引列维度一致。
  • 向量列可以为 NULL,但对应行不会进入 HNSW;标量距离函数也会返回 NULL
  • HNSW 构建使用随机和启发式步骤,因此不能保证副本具有逐字节相同的图拓扑。

实现说明

官方实现材料介绍了三项性能机制,但事务数据仍以 InnoDB 为准:

  1. 缓存图节点,而不是反复从辅助表加载;
  2. 在加载节点时预计算可复用的距离结果;
  3. 在支持的 CPU 上使用 SIMD(Single Instruction, Multiple Data,单指令多数据,包括 AVX-512)批量计算距离。

不要将文章中的性能百分比直接用于容量规划。请验证应用使用的具体版本、CPU 指令集、数据分布、召回目标、缓存大小和更新速率。

参考来源