Preface
TiDB v8.4(DMR) 版本开始提供向量搜索的实验特性,其向量能力基于 tiflash 构建。向量数据类型 vector 向量最大支持 16383 维, 向量搜索索引类型支持 HNSW (Hierarchical Navigable Small World) 。本文使用 TiDB v8.5.2 版本。
使用基础
创建向量索引
TiDB支持两种方式创建向量索引:
1)随建表对向量类型 vector 列创建 HNSW 索引
sql
CREATE TABLE foo (
id INT PRIMARY KEY,
embedding VECTOR(5),
VECTOR INDEX idx_embedding ((VEC_COSINE_DISTANCE(embedding)))
);
2)建表后对向量类型 vector 列创建 HNSW 索引
sql
CREATE VECTOR INDEX idx_embedding ON foo ((VEC_COSINE_DISTANCE(embedding)));
ALTER TABLE foo ADD VECTOR INDEX idx_embedding ((VEC_COSINE_DISTANCE(embedding)));
-- 你也可以显式指定 "USING HNSW" 使用 HNSW 构建向量搜索索引
CREATE VECTOR INDEX idx_embedding ON foo ((VEC_COSINE_DISTANCE(embedding))) USING HNSW;
ALTER TABLE foo ADD VECTOR INDEX idx_embedding ((VEC_COSINE_DISTANCE(embedding))) USING HNSW;
-- 查看索引构建进度
SELECT * FROM INFORMATION_SCHEMA.TIFLASH_INDEXES;
通过字段 ROWS_STABLE_INDEXED 和 ROWS_STABLE_NOT_INDEXED 列查看索引构建进度,当 ROWS_STABLE_NOT_INDEXED 变为 0 时,表示索引构建完成
使用向量索引
TiDB 支持 SQL 和 Python SDK 两种方式使用向量搜索功能,其中 SQL 方式通过 ORDER BY ... LIMIT 子句来使用向量搜索索引,示例所示:
SQL
SELECT *FROM foo
ORDER BY VEC_COSINE_DISTANCE(embedding, '[1, 2, 3, 4, 5]')
LIMIT 10
性能测试
VectorDBBench 是一款对向量数据库进行基准性能和容量测试的工具,
[VectorDBBbench 项目地址](https://github.com/zilliztech/VectorDBBench "VectorDBBbench github"),测试结果的指标中主要关注包括 qps、recall(召回率)、响应时间等。本文采用 5 台服务器做了初步性能测试,数据集 dataset 采用 biaosq_10m,向量维度1024维,服务器角色分配如下:
| 服务器 | 角色 |
| ----------- | ----------- |
| Server1 | tidb、tikv、pd |
| Server2 | tidb、tikv、pd |
| Server3 | tidb、tikv、pd |
| Server4 | tiflash |
| Server5 | tiflash |
| Server6 | vectordbbench、haproxy |
性能测试结果(仅供参考,未尝试任何优化)如下:
|TiFlash 实例数量| QPS | latency(p99) |Recall |
|-----------| ----------- | ----------- |------- |
|1 | 108 | 0.0694 |0.9256|
|2 | 45 | 0.1514 | 0.9558 |
业界产品性能可以参考 [VectorDB leader board](https://zilliz.com/vdbbench-leaderboard?dataset=vectorSearch)
展望
本次测试中,向量的功能和性能已经基本满足业务使用。当然对比同类产品,也客观存在一些不足,例如 ivf 向量索引、混合搜索、向量内存管理等还不支持。通过线下交流了解到,TiDB 团队正紧锣密鼓深耕向量存储、检索效率及生态适配等核心方向,很快将推出集成更多实用功能、性能进一步优化的新版本,值得期待。