You need to enable JavaScript to run this app.
文档中心
云数据库 MySQL 版

云数据库 MySQL 版

复制全文
下载 pdf
功能
向量索引
复制全文
下载 pdf
向量索引
本文介绍云数据库 MySQL 版提供的向量索引的相关信息。
支持版本
  • MySQL 8.0 版本,且内核小版本为 MySQL 8.0.43_20251015 及以上。
  • MySQL 8.4 版本,且内核小版本为 MySQL 8.4.7_20260415 及以上。
背景信息
近几年,数据库领域已从过去严格的精确匹配查询,转变为一种更为模糊、更注重上下文感知的模式。此次模式转变的核心在于向量搜索技术,该技术使得数据库能够基于数据的语义(即其内在含义)而非字面表述来理解和查询数据。
数据被表示为向量后,向量检索的基本任务就变成了为给定的查询向量找到 k-最近邻(K-Nearest Nighbor, KNN)。这需要计算查询向量与数据集中所有其他向量之间的距离,以识别出最相似的 k 个条目。SQL 表示如下。
SELECT id
FROM tv
ORDER BY L2_distance(vector, To_vector('[1,2,3,4]'))
LIMIT 10; -- top K, K=10
这个过程在概念上很简单,但面临着一个被称为“维度诅咒 Curse of dimensionality” 的问题。由于模型生成的向量嵌入通常是高维的,常常包含数百甚至数千个维度。随着维度数量的增加,向量空间的体积呈指数级增长。在这样一个巨大而稀疏的空间里,“邻近”的概念变得不那么有意义,几乎所有的点都变得彼此等距。
对于大规模在线应用而言,进行“暴力”的 KNN 搜索在计算上是不可行的。这种搜索的时间复杂度为线性,即O(N),其中 N 为数据集中的向量数量。对于包含数百万或数十亿向量的数据集,该方法会导致业务不可接受的高延迟。“维度诅咒”由此成为一个核心的问题,这推动了学界和业界对向量搜索算法的创新与多样化。大家都在尝试回答同一个问题:“如何在一个巨大的稀疏的空间里高效地找到最近似的向量,并且避免暴力搜索?”
为了克服“维度诅咒”带来的性能限制,现代向量搜索系统绝大多数依赖于近似最近邻(Approximate Nearest Neighbor, ANN)算法。ANN 的核心原则是以牺牲少量(通常可以忽略不计)的准确性,来换取搜索速度和可扩展性的巨大提升。ANN 算法不保证找到绝对真实的最近邻,而是采用启发式方法和优化的数据结构,在极短的时间内找到“足够好”的匹配项。
特性说明
云数据库 MySQL 版支持构建并使用 ANN 索引对存储的向量进行搜索,通过 “分层可导航小世界”,即 HNSW 算法构建向量索引。这是一个基于内存图的高效ANN算法。
使用说明
参数说明
参数类别
参数名称
默认值
是否需要重启以生效
取值范围
级别
参数描述
向量索引通用参数
loose_vector_index_enabled
ON
[ON|OFF]
Global
允许使用/创建向量索引。
loose_default_vector_distance
euclidean
[euclidean|l2|cosine]
Session/ Global
向量索引默认距离度量。
loose_default_vector_index_algorithm
HNSW
[hnsw]
Session/ Global
向量索引默认索引算法。
loose_vector_index_builder
1
[0, 256]
Global
并行构建向量索引时使用的工作线程数。设置为 0 表示由MySQL根据系统的CPU个数自动决策。
说明
  • 该参数仅支持 MySQL 8.0.43_20260415 之前内核版本的实例支持设置。
  • MySQL 8.0.43_20260415 和 MySQL 8.4.7_20260415 及以上内核版本的实例不再支持单独设置,此处的线程数与 innodb_parallel_read_threads 参数设置的一致。
loose_vector_index_reject_concurrent_dml
OFF
[ON|OFF]
Global
否在向量索引构建时直接拒绝并行DML(INSERT/UPDATE/DELTE),0 为允许,DML将等待索引构建结束时继续执行。1为直接拒绝DML并报错。
说明
  • 仅内核版本为 MySQL 8.0.43_20260415 以下的实例支持配置该参数。
  • MySQL 8.0.43_20260415 和 MySQL 8.4.7_20260415 及以上内核版本的实例不支持配置该参数。
loose_default_vector_quant_algorithm
sq
sq
Session/ Global
向量索引默认量化算法。
HNSW算法参数
loose_hnsw_ef_construction
10
[1, 10000]
Session/ Global
HNSW 索引构建时候选宽度。
loose_hnsw_ef_search
20
[1, 10000]
Session/ Global
HNSW 查询候选宽度。
loose_hnsw_default_m
16
[1, 10000]
Session/ Global
HNSW 每节点最大连接数 M。
loose_hnsw_max_cache_size
1GB
[0, 18446744073709551615]
Global
单索引最大缓存占用。
语法说明
CREATE TABLE
CREATE INDEX
ALTER TABLE
DROP INDEX
查看指定向量索引信息
近似最近邻(ANN)检索
通过 CREATE TABLE 语法创建一个包含向量列和向量索引的表。
语法
CREATE TABLE table_name [IF NOT EXISTS] (
[(create_definition,...)]
vector_column_name VECTOR(N) NOT NULL,
VECTOR {INDEX | KEY} [index_name] (vector_column_name)
[USING HNSW]
[SECONDARY_ENGINE_ATTRIBUTE= {...}]
) ENGINE = InnoDB;
参数说明
  • 向量索引关键字(必选):VECTOR INDEX(column_name) 或者 VECTOR KEY(column_name)
  • 算法类型(可选):
  • 方式 1:通过 USING [ANN_ALGORITHM] 指定 ANN 算法,如 HNSW
  • 方式 2:通过 SECONDARY_ENGINE_ATTRIBUTEalgorithm 字段指定索引。
  • 距离计算方法(可选):EUCLIDEANL2COSINE
  • 算法参数(可选):通过 SECONDARY_ENGINE_ATTRIBUTE 调整对应 ANN 算法的参数,如:
  • HNSW :M 值;ef_construction 值。
示例
  • 示例 1:使用系统默认的算法与参数。
  • CREATE TABLE tv (
    pk INT,
    embedding VECTOR(4) NOT NULL,
    VECTOR INDEX (embedding)
    ) ENGINE=InnoDB;
  • 示例 2:指定索引算法,使用默认算法参数。
  • CREATE TABLE tv (
    pk INT,
    embedding VECTOR(4) NOT NULL,
    VECTOR INDEX (embedding) USING HNSW
    ) ENGINE=InnoDB;
  • 示例 3:指定索引算法与参数。
  • CREATE TABLE tv (
    pk INT,
    embedding VECTOR(4) NOT NULL,
    VECTOR INDEX (embedding) SECONDARY_ENGINE_ATTRIBUTE='{"algorithm": "hnsw", "M": "16", "distance": "cosine"}'
    ) ENGINE=InnoDB;
RAG 框架集成
为了方便在 Python 应用中使用云数据库 MySQL 版的向量检索能力,我们提供了 LangChain 与 LlamaIndex 开源 RAG 框架的集成,它将底层的 SQL 操作封装为简单易用的 vector_store 接口。您可以将云数据库 MySQL 版无缝集成为 LangChain 的一个向量存储后端。它负责处理数据库连接、表和索引的创建、数据的增删改查以及相似度搜索,让您无需编写原生 SQL 即可完成常见的 RAG(检索增强生成)流程。
安装
  • Python ≥ 3.8。
pip install langchain-volcengine-mysql
  • 代码中导入云数据库 MySQL 版向量存储模块。
from langchain_volcengine_mysql import mysql
快速步骤
  1. 开启内核参数:确保云数据库 MySQL 版实例参数 loose_vector_index_enabled 已设置为 ON。
  1. 通过 mysql.configure() 配置 MySQL 实例信息,包括使用的 DB 名,表名和向量化函数。
  1. 数据注入与查询: 调用 add_texts 或 from_texts 等方法,将文本和外部计算的向量注入数据库。调用 similarity_search 或 similarity_search_by_vector 执行 ANN 查询。
代码示例
  • 通过 similarity_search 进行向量检索 。
  • 通过 get_relevant_documents 进行相关文档搜索。
from langchain_core.embeddings import FakeEmbeddings
from langchain_volcengine_mysql import mysql
# 1. Configure the connection and embedding function
embeddings = FakeEmbeddings(size=1024)
mysql.configure(
host="your-mysql-host.example.com",
port=3306,
user="your_user",
password="your_password",
database="your_db",
table_name="langchain_vectors",
embedding_function=embeddings,
)
# 2. Access the vector store and retriever
vector_store = mysql.vector_store
retriever = mysql.retriever
# 3. Add texts and perform searches
vector_store.add_texts(
["Example sentence one.", "Example sentence two."],
metadatas=[{"source": "demo1"}, {"source": "demo2"}],
)
# Similarity search via vector store
print(vector_store.similarity_search("Example", k=2))
# Retriever usage: fetch relevant documents
docs = retriever.get_relevant_documents("Example")
print([d.page_content for d in docs])
LangChain RAG 实战
完整的检索增强生成(RAG)应用搭建教程,请参见基于 MySQL 使用 LangChain 框架搭建一个 RAG 应用
安装
  • Python ≥ 3.8。
pip install llama-index-vector-stores-volcengine-mysql
  • 代码中导入云数据库 MySQL 版向量存储模块。
from llama_index.vector_stores.volcengine_mysql import VolcengineMySQLVectorStore
快速步骤
  1. 开启内核参数:确保云数据库 MySQL 版实例参数 loose_vector_index_enabled 已设置为 ON。
  1. 通过 VolcengineMySQLVectorStore.from_params 配置向量查询的后端数据库,包括数据库连接信息,表名、索引类型以及距离度量。
  1. 通过 from_documents 将文档向量化后插入索引。
  1. 使用 VectorStoreQuery 构建查询,并通过 vector_store.query 发起查询。
代码示例
from llama_index.core import Document, StorageContext, VectorStoreIndex, Settings
from llama_index.core.embeddings import BaseEmbedding
from llama_index.core.vector_stores.types import VectorStoreQuery
from llama_index.vector_stores.volcengine_mysql import VolcengineMySQLVectorStore
# Create Vector store backend
vector_store = VolcengineMySQLVectorStore.from_params(
host="your-mysql-host.example.com",
port=3306,
user="your_user",
password="your_password",
database="your_db",
table_name="llamaindex_demo",
embed_dim=EMBED_DIM, # 向量维度,需要提前定义变量,例如 EMBED_DIM = 1024
# Override default SSL‑related connect args to match the direct
# PyMySQL usage that already works for you.
connection_args={"read_timeout": 30},
ann_index_algorithm="hnsw",
ann_index_distance="l2",
ann_m=16,
ef_search=20,
perform_setup=True,
debug=False,
)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex.from_documents(
docs, # Documents to search
storage_context=storage_context,
embed_model=embed_model,
)
# Demonstrate direct vector‑store query
question = "What is veDB for MySQL?"
query_embedding = embed_model.get_text_embedding(question)
vs_query = VectorStoreQuery(
query_embedding=query_embedding,
similarity_top_k=3,
)
# Query to get result
result = vector_store.query(vs_query
注意事项
  • 外部 Embeddings :数据库不负责文本向量化,需在应用层提前用外部 Embeddings 计算向量。
  • 存储引擎与索引限制:仅支持 InnoDB;不支持分区表与虚拟列。
  • 索引使用:可建议使用 FORCE INDEX 保证 ANN;可设置 force_index=False 让优化器自行选择;可用 EXPLAIN 验证查询计划中是否出现 Using ANN Search
  • 距离度量:索引构建与查询尽量保持一致(如 l2);若不一致,以索引构建时的度量为准。
  • 删除与回收站:含向量索引的基表不进回收站;DROP TABLE 会直接删除基表。
  • 复制与开关:向量数据会复制到所有只读节点;仅开启 loose_vector_index_enabled 的节点会自动创建向量索引。
  • 持久性与事务:与基表一致,具备 ACID;回滚主事务时索引数据同步回滚。
  • 内存限制:单个 HNSW 内存使用受到 loose_hnsw_max_cache_size 参数限制,请合理设定此值避免内存不足。
性能数据
MySQL 从索引构建速度、索引的大小、索引查询性能三个方面,横向对比了与MariaDB 13.1 (同属 MySQL 生态)和 pgvector 0.8.2 (PostgreSQL 生态中最受欢迎的向量索引扩展)的差异,具体结果如下。
测试规格
  • 性能基准:VectorDBBench。
  • 数据集:Performance1536D50K(1536 维度 5 万行数据)与 Performance768D1M(768 维度 100 万行数据)。
  • 测试用 CPU 规格: Intel(R) Xeon(R) Platinum 8457C CPU @ 2.60GHz,16 核。
  • HNSW 索引缓存参数配置:loose_hnsw_max_cache_size = 2GB。
测试结果
索引的构建速度:提升 4~6 倍
MariaDB 的向量索引都是采用串行索引构建的,这就导致了构建大量向量索引的耗时极长。而火山引擎依靠自研的高性能并行构建引擎,打破了向量索引构建的瓶颈,即使是百万级向量数据,也可以快速构建向量索引。
本次测试使用参数 m=16、ef_construction=128 的 HNSW 索引配置,选取两组不同向量维度的数据集,统计了从向量数据载入至索引构建的整体耗时。
根据柱状图的对比数据,可以得出以下结论:
  • 1536 维、5 万条向量数据: MariaDB 构建索引耗时 126 秒,pgvector 构建索引耗时 27.76 秒,火山引擎 RDS MySQL 构建索引耗时 22 秒。火山引擎 RDS MySQL 构建索引的速度相比 MariaDB 提升约 6 倍。
  • 768 维、100 万条向量数据: MariaDB 构建索引耗时 2524.5 秒,pgvector 构建索引耗时 378.5 秒,火山引擎 RDS MySQL 构建索引耗时 645.6 秒。火山引擎 RDS MySQL 构建索引的速度相比 MariaDB 提升约 4 倍。
向量数据集越大,并行构建向量索引的效率提升越明显,在百万级向量索引构建场景下,索引的构建时间从 42 分钟缩短到至 11 分钟以内。
索引的大小:减少2~4倍
原生 pgvector 仅支持 Float32 向量存储,构建的索引占用的磁盘空间较大。而火山引擎 RDS MySQL 提供 SQ16、SQ8 两种标量量化,用更紧凑的方式存储向量索引。
结合上述柱状图对比数据,可以得出以下结论:
  • 1536 维、5 万条向量数据: MariaDB 构建的索引大小为 218.1 MB,pgvector 构建的索引大小为 391 MB,火山引擎 RDS MySQL 构建的索引大小为 220.4 MB。
  • 768 维、100 万条向量数据: MariaDB 构建的索引大小为 2.135 GB,pgvector 构建的索引大小为 3.906 GB,火山引擎 RDS MySQL 构建的索引大小为 2.219 GB。
相比 pgvector,开启 SQ16 量化后索引大小可缩减至 1/2,SQ8 量化后进一步缩减至 1/4,可以有效减少向量索引占用的磁盘空间,降低存储成本。
索引的查询性能:高召回下查询吞吐领先 2~3 倍
本次性能测试使用行业公认基准工具 VectorDBBench 执行,基于高召回率的实用业务区间,统计各数据库向量检索吞吐(QPS)指标。
结合上述柱状图对比数据,可以得出以下结论:
  • 1536 维 5 万条向量数据、97% 召回率: MariaDB 向量检索吞吐(QPS)为 5326,pgvector 向量检索吞吐(QPS)为 3600,火山引擎 RDS MySQL 向量检索吞吐(QPS)为 8334。相比之下,火山引擎 RDS MySQL 的向量吞吐(QPS) 约为 MariaDB 的 1.6 倍、pgvector 的 2.3 倍。
  • 768 维 100 万条向量数据、95% 召回率: MariaDB 向量检索吞吐(QPS)为 3703,pgvector 向量检索吞吐(QPS)为 2100,火山引擎 RDS MySQL 向量检索吞吐(QPS)为 4838。相比之下,火山引擎 RDS MySQL 的向量吞吐(QPS) 约为 MariaDB 的 1.3 倍、 pgvector 的 2.3 倍。
最近更新时间:2026.08.31 16:40:02
这个页面对您有帮助吗?
有用
有用
无用
无用