首批通过分布式安全可靠测评,为关键业务系统打造
Optimized Hint 类型下的 Vector Index Hint
更新时间:2026-07-15 15:16:39
在 MySQL 模式的 OceanBase 数据库中,使用 Vector Index Hint 可以控制查询时选择具体向量索引及设置前后过滤条件。
| Hint 名称 | 解释 |
|---|---|
VECTOR_INDEX |
指定查询时使用的向量索引,以及前后过滤条件。 |
语法
/*+ VECTOR_INDEX (table_name [, index_name] [, {'pre_filter' | 'post_filter'}]) */
参数说明如下:
table_name:主表的名称。index_name:指定使用的向量索引的名称,可以不指定,则由优化器自行选择索引。- 可指定的过滤条件,如果不指定则由优化器自行选择过滤方式:
pre_filter:用于在向量索引查询之前过滤。post_filter:用于在向量索引查询之后过滤。
示例
创建一个测试表
t,并插入测试数据:CREATE TABLE t(c1 INT, c2 INT, c3 INT); INSERT INTO t VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9);创建一个向量索引
vec_idx1CREATE VECTOR INDEX vec_idx1 ON t(c2) WITH (distance=l2, type=hnsw);使用
VECTOR_INDEXHint 指定查询时使用向量索引vec_idx1及后置过滤条件EXPLAIN SELECT /*+VECTOR_INDEX(t vec_idx1 post_filter)*/ * FROM t WHERE c1 > 1 AND c2 > 2 ORDER BY l2_distance(cv, '[1,2,3]') APPROX LIMIT 1;返回结果如下,其中
VECTOR INDEX ADAPTIVE SCAN (POST-ITERATIVE-FILTER)表示使用向量索引vec_idx1进行查询,且使用了后置过滤条件:Query Plan ========================================================================================= |ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| ----------------------------------------------------------------------------------------- |0 |VECTOR INDEX ADAPTIVE SCAN (POST-ITERATIVE-FILTER)|t(vec_idx1)|2 |15 | ========================================================================================= Outputs & filters: ------------------------------------- 0 - output([t.c1], [t.c2], [t.cv]), filter([t.c1 > 1], [t.c2 > 2]), rowset=16 access([t.__pk_increment], [t.cv], [t.c1], [t.c2]), partitions(p0) is_index_back=true, is_global_index=false, filter_before_indexback[true,false], range_key([t.c1], [t.__pk_increment]), range(1,MAX ; MAX,MAX)
与 INDEX Hint 的配合使用
本节简要梳理向量索引 Hint(VECTOR_INDEX)与普通索引 Hint(INDEX)配合使用时的行为规则,优化实际 Hint 应用的说明:
- 仅指定 INDEX Hint(普通索引):优先采用 pre filter(前过滤)。
- 仅指定 INDEX Hint(向量索引):优先采用 post filter(后过滤),且命中指定的向量索引。
- 仅指定 VECTOR_INDEX Hint:由优化器根据 Hint 配置选择具体索引和过滤方式。
- 当同时指定 INDEX Hint 和 VECTOR_INDEX Hint 时,系统优先采用 VECTOR_INDEX Hint。若存在多个 VECTOR_INDEX Hint,则从中随机选择一个生效。
下文我们通过示例来详细说明向量索引 Hint(VECTOR_INDEX)与普通索引 Hint(INDEX)配合使用时的行为规则。
示例表结构如下:
CREATE TABLE t(c1 INT, c2 INT, cv VECTOR(3));
CREATE INDEX idx1 ON t(c1);
CREATE INDEX idx2 ON t(c2);
CREATE VECTOR INDEX vec_idx1 ON t(cv) WITH (type=hnsw, distance=l2);
CREATE VECTOR INDEX vec_idx2 ON t(cv) WITH (type=hnsw_bq, distance=l2);
CREATE VECTOR INDEX vec_idx3 ON t(cv) WITH (type=hnsw, distance=cosine);
这里介绍几种常见的使用场景:
仅指定 INDEX Hint(普通索引)
SELECT /*+INDEX(t idx1)*/ * FROM t ORDER BY l2_distance(cv, @vec) WHERE c1 < 1 AND c2 < 1 APPROX LIMIT 6;本例优先采用 pre filter(前过滤)。
仅指定 INDEX Hint(向量索引)
SELECT /*+INDEX(t vec_idx2)*/ * FROM t ORDER BY l2_distance(cv, @vec) WHERE c1 < 1 AND c2 < 1 APPROX LIMIT 6;本例优先采用 post filter(后过滤),且命中指定的向量索引
vec_idx2。仅指定 VECTOR_INDEX Hint(pre_filter)
SELECT /*+VECTOR_INDEX(t vec_idx1 pre_filter)*/ * FROM t ORDER BY l2_distance(cv, @vec) WHERE c1 < 1 AND c2 < 1 APPROX LIMIT 6;上例指定使用向量索引
vec_idx1的前过滤。若未额外指定前过滤的具体索引,则优化器会从相关列的可用索引中自动选择(如c1、c2上各有索引,则皆可能用于前过滤)。同时指定 INDEX Hint(普通索引)和 VECTOR_INDEX Hint(pre_filter)
SELECT /*+INDEX(t idx1) VECTOR_INDEX(t vec_idx1 pre_filter)*/ * FROM t ORDER BY l2_distance(cv, @vec) WHERE c1 < 1 AND c2 < 1 APPROX LIMIT 6;本例优先采用 VECTOR_INDEX 指向的前过滤,并且指定了使用向量索引
vec_idx1和普通索引idx1负责前过滤。同时指定 INDEX Hint(普通索引)和 VECTOR_INDEX Hint(post_filter)
SELECT /*+INDEX(t idx1) VECTOR_INDEX(t vec_idx1 post_filter)*/ * FROM t ORDER BY l2_distance(cv, @vec) WHERE c1 < 1 AND c2 < 1 APPROX LIMIT 6;本例将优先采用向量索引
vec_idx1的后过滤。需要注意,当前版本中后过滤不支持与普通索引联合使用,因此即使同时指定了index(t idx1),该 Hint 也不会起作用,最终仅应用 VECTOR_INDEX Hint 所指定的向量索引vec_idx1的后过滤。同时指定 INDEX Hint(向量索引)和 VECTOR_INDEX Hint(pre_filter)
SELECT /*+INDEX(t vec_idx2) VECTOR_INDEX(t vec_idx1 pre_filter)*/ * FROM t ORDER BY l2_distance(cv, @vec) WHERE c1 < 1 AND c2 < 1 APPROX LIMIT 6;本例优先依照 VECTOR_INDEX Hint 指定走
vec_idx1的前过滤,INDEX Hint(向量索引)index(t vec_idx2)不生效。VECTOR_INDEX Hint 指定的向量索引距离算法与查询算法不匹配
SELECT /*+INDEX(t vec_idx2) VECTOR_INDEX(t vec_idx3 pre_filter)*/ * FROM t ORDER BY l2_distance(cv, @vec) WHERE c1 < 1 AND c2 < 1 APPROX LIMIT 6;本例 VECTOR_INDEX Hint 失效,若还有其它 INDEX Hint,则按照上文说明的行为规则选择。从上文示例表结构中可以看到
vec_idx3距离算法为 cosine,而查询为 l2,此 Hint 失效,则按index(t vec_idx2)后过滤规则生效。同时指定多个 VECTOR_INDEX Hint 且距离算法一致
SELECT /*+VECTOR_INDEX(t vec_idx1 pre_filter) VECTOR_INDEX(t vec_idx2 post_filter)*/ * FROM t ORDER BY l2_distance(cv, @vec) WHERE c1 < 1 AND c2 < 1 APPROX LIMIT 6;若距离算法均一致,优化器会从中择一生效,但不保证顺序或指定哪一个。
通过以上规则,可灵活组合 VECTOR_INDEX 与 INDEX Hint 实现向量索引和普通索引的最优协同。