Native Vector Search
AliSQL 在 MySQL / InnoDB 中增加 VECTOR(N) 类型、欧氏距离和余弦距离函数,以及 HNSW 近似最近邻索引。当前实现最多支持 16,383 维的向量。
存储与查询路径
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_EUCLIDEAN 和 VEC_DISTANCE_COSINE。
HNSW 参数
| 变量或索引选项 | 作用域 | 默认值 | 文档记录的范围或取值 |
|---|---|---|---|
vidx_disabled | 全局 | ON | ON、OFF |
vidx_default_distance | 全局、会话 | EUCLIDEAN | EUCLIDEAN、COSINE |
vidx_hnsw_default_m / M | 全局、会话 / 索引 | 6 | 3 到 200 |
vidx_hnsw_ef_search | 全局、会话 | 20 | 1 到 10000 |
vidx_hnsw_cache_size | 全局 | 16 MiB | 1 MiB 到 ULLONG_MAX 字节 |
M 会影响图的连接性,ef_search 会影响搜索宽度,缓存上限则决定内存中可保留多少图数据。这三个参数都需要结合实际负载调优,并同时测量召回率、延迟、构建成本和内存使用量。
事务与 DDL 限制
- 向量索引只支持 InnoDB 表。
- 向量索引操作要求
READ COMMITTED。 - 支持并发读取以及读写并发;当前不支持对同一向量表并发写入。
- 创建、修改或删除向量索引不能使用
ALGORITHM=INPLACE。 - 向量索引不能设置为
INVISIBLE。 - 查询向量的维度必须与索引列维度一致。
- 向量列可以为
NULL,但对应行不会进入 HNSW;标量距离函数也会返回NULL。 - HNSW 构建使用随机和启发式步骤,因此不能保证副本具有逐字节相同的图拓扑。
实现说明
官方实现材料介绍了三项性能机制,但事务数据仍以 InnoDB 为准:
- 缓存图节点,而不是反复从辅助表加载;
- 在加载节点时预计算可复用的距离结果;
- 在支持的 CPU 上使用 SIMD(Single Instruction, Multiple Data,单指令多数据,包括 AVX-512)批量计算距离。
不要将文章中的性能百分比直接用于容量规划。请验证应用使用的具体版本、CPU 指令集、数据分布、召回目标、缓存大小和更新速率。
