如何提升向量查询速度

【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】ob
【 使用版本 】4.3.4.1
【问题描述】


执行的sql
select
id
from image_search
order by cosine_distance(embedding,#{embedding})
limit 100
总共278w行数据。
表总大小574MB。
查询一次耗时接近18s

表结构:

CREATE TABLE image_search (
id int(11) NOT NULL AUTO_INCREMENT,
product_id int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘业务关联id’,
image_id int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘图片表id:image_info表id’,
original int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘图片业务来源代码’,
int_attr1 int(11) DEFAULT ‘0’ COMMENT ‘检索字段 - int类型1’,
int_attr2 int(11) DEFAULT ‘0’ COMMENT ‘检索字段 - int类型2’,
int_attr3 int(11) DEFAULT ‘0’ COMMENT ‘检索字段 - int类型3’,
str_attr1 varchar(20) DEFAULT ‘’ COMMENT ‘检索字段- str类型1’,
str_attr2 varchar(20) DEFAULT ‘’ COMMENT ‘检索字段- str类型2’,
str_attr3 varchar(20) DEFAULT ‘’ COMMENT ‘检索字段- str类型3’,
embedding VECTOR(512) DEFAULT NULL,
create_time timestamp(3) NULL DEFAULT CURRENT_TIMESTAMP(3),
modify_time timestamp(3) NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (id),
UNIQUE KEY uniq_product_id_image_id_original (product_id, image_id, original) BLOCK_SIZE 16384 LOCAL,
VECTOR KEY img_embedding_idx (embedding) WITH (DISTANCE=L2, TYPE=HNSW, LIB=VSAG, M=16, EF_CONSTRUCTION=200, EF_SEARCH=64) BLOCK_SIZE 16384
)

2 个赞

什么索引类型呢

2 个赞

问题太高大上了

2 个赞

执行计划加性能日志

2 个赞

https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000003891769

显示是可以创建 COSINE算法的索引的。
WITH (DISTANCE=COSINE, TYPE=HNSW, LIB=VSAG, M=16, EF_CONSTRUCTION=200, EF_SEARCH=64)

但实际情况,在3.4.1版本中,创建该算法的索引显示:
this type of vector index distance algorithm is not supported

2 个赞
  • 查询语法要求:
    • 必须指定 APPROXIMATE/APPROX 关键字才会选择向量索引路径。
    • 必须包含 ORDER BYLIMIT 子句。
    • ORDER BY 只支持单个向量条件。
    • LIMIT + OFFSET 的取值范围为 (0, 16384]
  • 距离函数使用规则:
    • 指定 APPROXIMATE/APPROX,调用当前版本支持的距离函数,且与向量索引算法匹配,检索会使用向量索引。
    • 指定 APPROXIMATE/APPROX,距离函数与向量索引算法不匹配,检索不会使用向量索引,但也不会报错。
    • 指定 APPROXIMATE/APPROX,如果距离函数为当前版本不支持的距离函数,检索不会使用向量索引,且会报错。
    • 未指定 APPROXIMATE/APPROX,调用当前版本支持的距离函数,检索不会使用向量索引,但也不会报错。
  • 其他说明:
    • WHERE 条件会作为向量索引查询后的过滤条件。
    • 不指定 LIMIT 子句会报错。

本次问题,是由于未指定APPROXIMATE/APPROX 。加上就好了

2 个赞

学习

1 个赞

学习了