全部產品
Search
文件中心

PolarDB:使用MySQL協議進行向量檢索

更新時間:Nov 01, 2025

PolarDB MySQL版通過內建的向量資料類型、距離函數和向量索引,支援以SQL語言進行高效的向量相似性檢索。該功能適用於推薦系統、聊天機器人、映像檢索等應用情境。向量計算能力整合於資料庫核心中,支援ACID事務,並藉助列存索引(IMCI)和HNSW等演算法,能夠提供100%召回率的精確KNN檢索以及高效能的近似ANN檢索。

適用範圍

使用本功能前,請確認您的叢集版本需滿足:核心版本為MySQL 8.0.2,且修訂版本需為8.0.2.2.30及以上版本。

版本更新記錄

不同核心版本支援的功能存在差異。建議升級至最新版本。

功能點

最低核心版本要求

說明

基礎向量功能與HNSW索引演算法。

8.0.2.2.30

提供向量檢索的基礎能力。

新增FAISS_HNSW_FLATFAISS_HNSW_PQ索引演算法。

8.0.2.2.31

引入基於FAISS實現的索引演算法。

修改或刪除向量索引。

8.0.2.2.32

允許通過ALTER TABLE動態管理向量索引。

向量類型

類型定義

CREATE TABLEALTER TABLE語句中使用VECTOR(N)類型定義向量列。

  • N代表向量的維度,取值範圍為1到16383。

  • 向量的每一維均為單精確度浮點數(4位元組)。

  • 向量類型僅支援與向量類型進行等值比較,禁止與其他任意類型進行比較。

  • 向量列不能作為主鍵、外鍵、唯一鍵或分區鍵。

樣本

-- 以下樣本表示在表t1中定義列v1的向量維度為4
CREATE TABLE t1 (id INT PRIMARY KEY, v1 VECTOR(4));
說明

如果定義維度超過16383,將返回錯誤Data size (xxx Bytes, xxx dimensions) exceeds VECTOR max (65532 Bytes, 16383 dimensions) for column: 'xxx'

類型轉換

PolarDB提供STRING_TO_VECTORVECTOR_TO_STRING函數,用於在字串格式和二進位格式之間轉換。

字串轉二進位(STRING_TO_VECTOR

此函數用於將文字格式設定的向量轉換為資料庫內部的二進位格式。

  • 輸入格式:由方括弧[]包裹、英文逗號,分隔的浮點數序列,例如'[1.2, 3.4, 5.6]'

    說明

    如果輸入格式錯誤的字串,將返回錯誤Data cannot be converted to a valid vector: 'xxx'

  • 位元組序說明:轉換後的位元據採用小端位元組序(Little-Endian)。例如,浮點數1.0的十六進位表示0x3F800000存入資料庫後,其二進位HEX值為0000803F。在跨系統進行資料序列化時需注意此點。

樣本

SELECT STRING_TO_VECTOR('[1,2,3,4]');
+-------------------------------+
| STRING_TO_VECTOR('[1,2,3,4]') |
+-------------------------------+
|   �?   @  @@  �@              |
+-------------------------------+
SELECT HEX(STRING_TO_VECTOR('[1,2,3,4]'));
+------------------------------------+
| HEX(STRING_TO_VECTOR('[1,2,3,4]')) |
+------------------------------------+
| 0000803F000000400000404000008040   |
+------------------------------------+

二進位轉字串(VECTOR_TO_STRING

此函數用於將資料庫中儲存的二進位向量資料轉換為字串格式。

輸入格式:每4個位元組對應向量中某一維的浮點數的Binary表示,採用小端位元組序(Little-Endian)。例如,浮點數1.0的十六進位表示為0x3F800000,存入資料庫後,其二進位HEX值為0000803F。在跨系統進行資料序列化時需注意此點。

說明

如果輸入格式錯誤的Binary,將返回錯誤Data cannot be converted to a valid vector: ''

樣本

SELECT VECTOR_TO_STRING(0x0000803F000000400000404000008040);
+------------------------------------------------------+
| VECTOR_TO_STRING(0x0000803F000000400000404000008040) |
+------------------------------------------------------+
| [1.00000e+00,2.00000e+00,3.00000e+00,4.00000e+00]    |
+------------------------------------------------------+

相關操作樣本

建立包含向量列的新表

CREATE TABLE t1 (id INT PRIMARY KEY, v1 VECTOR(4));

將向量列添加到現有表中

ALTER TABLE t1 ADD COLUMN v1 VECTOR(4);

插入向量

  • 向量通過STRING_TO_VECTOR函數以字串的形式插入。

    INSERT INTO t1 (id, v1) VALUES (1, STRING_TO_VECTOR('[1.0, 2.0, 3.0, 4.0]'));
  • 向量以Binary的形式插入。

    INSERT INTO t1 VALUES (2, 0x0000803F000000400000404000008040);

插入或更新向量

向量通過STRING_TO_VECTOR以字串的形式插入或更新。

INSERT INTO t1 VALUES (1, STRING_TO_VECTOR('[1.0, 2.0, 3.0, 4.0]')) ON DUPLICATE KEY UPDATE v1 = STRING_TO_VECTOR('[1.0, 2.0, 3.0, 4.0]');

更新向量

向量通過STRING_TO_VECTOR以字串的形式更新。同時,也支援直接以Binary的形式更新。

UPDATE t1 SET v1 = STRING_TO_VECTOR('[1.0, 2.0, 3.0, 4.0]') WHERE id = 1;

刪除向量

向量通過STRING_TO_VECTOR以字串的形式刪除。同時,也支援直接以Binary的形式刪除。

DELETE FROM t1 WHERE v1 = STRING_TO_VECTOR('[1.0, 2.0, 3.0, 4.0]');

使用向量索引

PolarDB通過在列的COMMENT中定義特殊格式的字串來建立向量索引。

前置條件

在使用向量索引之前,需先添添加列存索引唯讀節點,並為該列或整個表建立列存索引。即只有列存索引唯讀節點才能構建向量索引,以支援向量檢索。

建立向量索引

CREATE TABLEALTER TABLE時,通過修改列的COMMENT來定義向量索引。

文法說明

COMMENT 'imci_vector_index=向量索引演算法(索引參數列表) [其他備忘]'
  • imci_vector_index=:固定首碼,聲明這是一個向量索引定義。

  • 向量索引演算法:索引演算法,如HNSWFAISS_HNSW_FLATFAISS_HNSW_PQ演算法。

  • 索引參數列表:括弧內為索引的構建參數。

    • 多個參數間可用空格、英文逗號或英文分號分隔。為避免混淆,建議統一使用英文逗號。

    • 單個參數寫法為參數名=參數值參數名:參數值。例如:HNSW(metric=COSINE,max_degree=16,ef_construction=300)

    • 當所有參數都使用預設值時仍然需要指定圓括弧。例如:COMMENT "imci_vector_index=HNSW() 其他備忘資訊"

索引演算法

演算法

適用情境

HNSW

基於VSAG實現,追求高精度,記憶體佔用較大。

FAISS_HNSW_FLAT

基於FAISS實現,追求高精度,記憶體佔用較大。

FAISS_HNSW_PQ

基於FAISS實現,通過乘積量化(PQ)壓縮向量,降低記憶體佔用,但會損失一定精度。

索引參數

參數

可用別名

適用演算法

作用

可選值/範圍

預設值

metric

distance

  • HNSW

  • FAISS_HNSW_FLAT

  • FAISS_HNSW_PQ

向量相似性度量。

  • COSINE(餘弦距離)

  • INNER_PRODUCT(內積)

  • EUCLIDEAN(歐式距離)

說明

僅支援大寫。

COSINE

max_degree

M

  • HNSW

  • FAISS_HNSW_FLAT

  • FAISS_HNSW_PQ

圖中每個節點的最大串連數。

正整數。值越大,圖越稠密,構建越慢,記憶體佔用越高,但查詢精度可能更高。建議範圍16-64。

16

ef_construction

-

  • HNSW

  • FAISS_HNSW_FLAT

  • FAISS_HNSW_PQ

構建索引時搜尋的鄰居節點數量。

正整數。值越大,索引品質越高,但構建時間越長。建議設定為100-500。

200

pq_m

-

FAISS_HNSW_PQ

乘積量化(PQ)子空間的數量。

可整除維度正整數。向量維度需能被pq_m整除。值越大,精度越高,但記憶體佔用也越高。

1

pq_nbits

-

FAISS_HNSW_PQ

乘積量化(PQ)中每個子空間量化表示使用的bit數。

小於或等於24的正整數。通常設定為8,表示每個子空間有256個中心點。

8

樣本1:建立表時定義向量索引

-- 方案一:為整個表開啟列存,然後在v1列上定義向量索引
CREATE TABLE t1 (
    id INT PRIMARY KEY,
    v1 VECTOR(4) COMMENT 'imci_vector_index=HNSW(metric=COSINE, max_degree=16)'
) COMMENT 'COLUMNAR=1';

-- 方案二:僅為v1列開啟列存和向量索引
CREATE TABLE t1 (
    id INT PRIMARY KEY,
    description TEXT,
    v1 VECTOR(4) COMMENT 'COLUMNAR=1, imci_vector_index=HNSW(metric=COSINE)'
);

樣本2:為現有表添加向量索引

-- 假設現有表為t1
CREATE TABLE t1 (
    id int auto_increment PRIMARY KEY,
    v1 vector(4)
);

-- 方案一:添加表級列存索引同時修改VECTOR列備忘資訊指定向量索引演算法及參數
ALTER TABLE t1 comment "COLUMNAR=1", MODIFY COLUMN v1 vector(4) COMMENT "imci_vector_index=HNSW(metric=COSINE,max_degree=16,ef_construction=300)";


-- 方案二:僅為v1列建立列存索引,列存索引初始化時會自動根據v1列上的備忘資訊建立向量索引
ALTER TABLE t1 MODIFY COLUMN v1 vector(4) COMMENT "COLUMNAR=1 imci_vector_index=HNSW(metric=COSINE,max_degree=16,ef_construction=300)";

參數說明

參數名

說明

imci_enable_inline_vector_index

是否允許建立向量索引。

  • ON(預設):開啟後,列存索引唯讀節點會在建立列存索引時根據向量列的備忘資訊來建立向量索引。

  • OFF:關閉後,列存索引唯讀節點在建立列存索引時不再為向量列建立向量索引,關閉前建立的存量向量索引會繼續構建但重啟後不再載入和構建。

imci_vector_index_dump_rows_threshold

用於控制向量索引的增量寫入大小。背景工作會定期檢查當前向量索引快照位點與列存索引快照位點之間的增量。當增量行數超過該閾值時,背景工作將會提交新增資料行以追加到向量索引中。

  • 取值範圍:1~4294967295。

  • 預設值:1000。

  • 單位:行數。

修改向量索引

說明

修訂版本為8.0.2.2.32及以上版本支援通過修改向量類型的列上的備忘資訊來修改向量索引的演算法和參數。

  • 修改向量索引演算法。

    CREATE TABLE t1 (
        id int auto_increment PRIMARY KEY,
        v1 vector(4) COMMENT "imci_vector_index=HNSW(metric=COSINE,max_degree=16,ef_construction=300)"
    ) COMMENT 'COLUMNAR=1';
    
    -- 修改索引演算法,將HNSW演算法修改為基於FAISS的HNSW演算法
    ALTER TABLE t1 modify column v1 vector(4) COMMENT "imci_vector_index=FAISS_HNSW_FLAT(metric=COSINE,max_degree=16,ef_construction=300)";
  • 修改向量索引參數。

    CREATE TABLE t1 (
        id int auto_increment PRIMARY KEY,
        v1 vector(4) COMMENT "imci_vector_index=HNSW(metric=COSINE,max_degree=16,ef_construction=300)"
    ) COMMENT 'COLUMNAR=1';
    
    -- 修改索引參數,將HNSW的max_degree由16修改為32
    ALTER TABLE t1 modify column v1 vector(4) COMMENT "imci_vector_index=HNSW(metric=COSINE,max_degree=32,ef_construction=300)";

刪除向量索引

  • 刪除列存索引時刪除向量索引。

    CREATE TABLE t1 (
        id int auto_increment PRIMARY KEY,
        v1 vector(4) COMMENT "imci_vector_index=HNSW(metric=COSINE,max_degree=16,ef_construction=300)"
    ) COMMENT 'COLUMNAR=1';
    
    -- 向量索引不能獨立於列存索引存在,會被串聯刪除
    ALTER TABLE t1 COMMENT 'COLUMNAR=0';
  • 僅刪除向量索引。

    說明

    修訂版本為8.0.2.2.32及以上版本支援通過刪除向量類型的列上的備忘資訊來刪除向量索引。

    CREATE TABLE t1 (
        id int auto_increment PRIMARY KEY,
        v1 vector(4) COMMENT "imci_vector_index=HNSW(metric=COSINE,max_degree=16,ef_construction=300)"
    ) COMMENT 'COLUMNAR=1';
    
    -- 通過刪除向量類型的列上的備忘資訊來刪除向量索引
    ALTER TABLE t1 modify column v1 vector(4) COMMENT "";

向量查詢

近似最近鄰(ANN)檢索

近似最近鄰(ANN)檢索基於向量索引加速查詢。

使用限制

最佳化器僅在識別到特定SQL模式時才使用向量索引,查詢需同時滿足以下所有條件:

  • 需同時包含ORDER BYLIMIT子句。

  • ORDER BY的第一個運算式需為DISTANCE(...)

  • ORDER BY DISTANCE(...)的排序方向是ASC

  • DISTANCE(...)運算式中的欄位必須存在可用的向量索引

  • DISTANCE(...)運算式中的距離參數metric必須與建立向量索引時使用的距離參數metric保持一致。例如,如果向量索引採用COSINE距離構建,則DISTANCEE(...)也必須指定COSINE

  • 若包含JOIN,執行計畫必須採用右深樹(Right Deep Join Tree)結構,且DISTANCE(...)運算式中引用的欄位必須來自JOIN的驅動表。

  • 查詢中不能包含GROUP BY子句。如需彙總,應在子查詢中完成向量檢索。

啟用ANN檢索的步驟

  1. 啟用向量索引加速功能
    在會話中執行以下命令,允許最佳化器使用向量索引。

    SET imci_enable_vector_search = ON;
  2. 強制查詢使用列存執行計畫
    為確保查詢能訪問到構建在列存上的向量索引,需強制查詢走列存路徑。

    SET cost_threshold_for_imci = 0;
    重要

    SET cost_threshold_for_imci = 0;是一個會話層級的設定,為了強制將該會話中的所有查詢使用列存索引。這可能導致本應在行存上高效啟動並執行查詢(例如,通過主鍵進行的點查)效能下降。因此,建議僅在執行向量檢索的會話中使用此設定,切勿將其設定為全域參數。

  3. 編寫符合ANN觸發條件的查詢
    執行滿足約束條件的SQL即可使用向量索引完成近似最近鄰檢索。

    -- 尋找Top 5最相似的記錄
    SELECT id, v1
    FROM t1
    WHERE category_id = 123 -- 可加附件條件
    ORDER BY DISTANCE(v1, STRING_TO_VECTOR('[...]'), 'COSINE') ASC
    LIMIT 5;

    不合規查詢的修正(以GROUP BY為例):

    -- 錯誤寫法:GROUP BY 與 ORDER BY DISTANCE() 衝突
    -- SELECT category_id, COUNT(*) FROM t1 GROUP BY category_id ORDER BY DISTANCE(v1, STRING_TO_VECTOR('[...]'), 'COSINE') ASC LIMIT 5;
    
    -- 正確寫法:先用子查詢完成ANN檢索,再對結果進行彙總
    SELECT category_id, COUNT(*)
    FROM (
        SELECT id, category_id
        FROM t1
        ORDER BY DISTANCE(v1, STRING_TO_VECTOR('[...]'), 'COSINE') ASC
        LIMIT 100 -- 先召回100個最近鄰
    ) AS nearest_neighbors
    GROUP BY category_id;
  4. 您可以通過EXPLAIN語句來判斷在SQL語句中使用的向量索引加速近似最近鄰檢索功能是否生效。如果執行計畫中包含Vector Search,則表示向量索引加速近似最近鄰檢索功能生效。

    EXPLAIN SELECT * FROM t1 ORDER BY DISTANCE(v1, STRING_TO_VECTOR('[1.2, 2.3, 3.4, 4.5]'), 'COSINE') LIMIT 2;

    輸出樣本:

    +----+---------------------------+------+--------+--------+---------------------------------------------------------------------------------------+
    | ID | Operator                  | Name | E-Rows | E-Cost | Extra Info                                                                            |
    +----+---------------------------+------+--------+--------+---------------------------------------------------------------------------------------+
    |  1 | Select Statement          |      |        |        | IMCI Execution Plan (max_dop = 2, max_query_mem = 429496729)                          |
    |  2 | └─Compute Scalar          |      | 2      | 0.00   |                                                                                       |
    |  3 |   └─Limit                 |      | 2      | 0.00   | Offset=0 Limit=2                                                                      |
    |  4 |     └─Sort                |      | 2      | 0.00   | Sort Key: VECTOR_DISTANCE(t1.v1,"[1.200000,2.300000,3.400000,4.500000]","COSINE") ASC |
    |  5 |       └─Vector Search     | t1   | 2      | 0.00   |                                                                                       |
    +----+---------------------------+------+--------+--------+---------------------------------------------------------------------------------------+

參數說明

參數名稱

參數說明

imci_enable_vector_search

使用向量索引加速近似最近鄰(ANN)檢索的控制開關。

  • ON(預設):開啟使用向量索引加速近似最近鄰(ANN)檢索功能。

  • OFF:關閉使用向量索引加速近似最近鄰(ANN)檢索功能。

imci_hnswpq_k_factor

當向量索引使用FAISS_HNSW_PQ演算法時,向量檢索的擴召回倍數。

  • 取值範圍:1~UINT32_MAX.

  • 預設值:1。

  • 單位:倍數。

說明

在進行向量查詢以召回K個近似最近鄰(ANN)時,執行器將從HNSW PQ索引中召回K * imci_hnswpq_k_factor個結果,然後對這些結果使用原始向量進行精確排序,最終按順序返回K個結果。

查看向量

SELECT VECTOR_TO_STRING(v1) FROM t1;

距離計算

通過DISTANCE函數可以採用指定方式計算兩個向量之間的相似性。

DISTANCE(vector1, vector2, '<metric>')

metric參數說明

參數

說明

COSINE

餘弦相似性。衡量兩個向量之間的方向相似性,結果為兩個向量夾角的餘弦值。越小越相似。

EUCLIDEAN

歐式距離。衡量兩個向量或點在歐幾裡得空間中的直線距離。越小越相似。

DOT

點積。兩個向量對應分量相乘後再相加的結果。越小越相似。

樣本

SELECT DISTANCE(v1, STRING_TO_VECTOR('[1.2,2.3,3.4,4.5]'), 'COSINE') FROM t1;

精確最近鄰(KNN)檢索

精確檢索會遍曆所有資料計算距離,保證100%的召回率。它不依賴向量索引,適用於資料量較小的情境。

-- 尋找與目標最相似的10條記錄SELECT id, VECTOR_TO_STRING(v1)FROM t1
ORDER BY DISTANCE(v1, STRING_TO_VECTOR('[...]'), 'COSINE')LIMIT 10;

樣本

SELECT id, VECTOR_TO_STRING(v1) FROM t1 ORDER BY DISTANCE(v1, STRING_TO_VECTOR('[1.2,2.3,3.4,4.5]'), 'COSINE') LIMIT 1;

包含謂詞的向量查詢

您可以使用額外的列作為謂詞,來過濾向量查詢結果。例如:

SELECT * FROM t1 WHERE id < 10 ORDER BY DISTANCE(v1, STRING_TO_VECTOR('[1.2, 2.3, 3.4, 4.5]'), 'COSINE') LIMIT 2;

在使用包含謂詞的SQL語句進行向量查詢時,可以通過調整相關參數的值來控制向量索引召回和謂詞過濾的先後順序。

執行方式

向量檢索通常伴隨其他屬性的過濾。最佳化器會根據過濾條件的選擇性,智能選擇執行策略:

  • 前置過濾(prefilter):當過濾條件能大幅減少資料量時(如匹配行數小於imci_vector_search_prefilter_rows,預設10000),系統將首先對全表進行謂詞過濾,以擷取匹配的記錄,然後對這些記錄進行排序,最終按順序返回由LIMIT指定的數量的記錄。

  • 後置過濾 (postfilter):當過濾條件選擇性較差時(如匹配率高於imci_vector_search_filter_pct,預設20%),系統將首先應用向量索引進行結果召回,然後對召回的結果進行謂詞過濾。如果過濾後的結果數量少於LIMIT指定的數量,則需重複上述過程。

  • 內聯過濾(inline filter):如果最佳化器未選擇前置過濾或後置過濾的執行方式,那麼將選擇使用內聯過濾的方式執行。系統將首先通過謂詞對全表進行過濾,利用匹配記錄的RowID構建bitmap過濾器。隨後,將採用向量索引進行召回。在向量索引的檢索過程中,通過bitmap過濾器進行篩選,以確保返回的最相似記錄滿足謂詞條件。

自適應執行最佳化

由於最佳化器對謂詞過濾所匹配行數的預估可能存在偏差,導致執行方式的選擇可能並非最優。因此,採用自適應執行機制,在執行過程中根據實際匹配行數動態切換執行方式。

在使用內聯過濾(inline filter)方式執行包含謂詞的向量查詢時,如果在進行謂詞過濾全表後,實際匹配的記錄數量低於imci_vector_search_prefilter_rows,則會動態切換為前置過濾方式進行執行。

分區最佳化

向量查詢通常包含租戶ID或標籤等謂詞條件。針對這類查詢,可以採用LIST DEFAULT HASH的分區方式,為資料量較大的租戶或標籤構建獨立的LIST分區,而為其他租戶或標籤構建DEFAULT HASH分區。最佳化器能夠識別這類查詢,並依據分區裁剪的結果,為較大租戶或標籤的向量查詢選擇後置過濾的執行方式,而為其他租戶的向量查詢則使用前置過濾或內聯過濾的執行方式,儘可能為不同規模的租戶或標籤選擇最優的執行方式。

參數說明

參數名稱

參數說明

imci_vector_search_filter_pct

當謂詞過濾的預估選擇率大於或等於該參數值時,優先使用向量索引召回。

  • 取值範圍:0~100。

  • 預設值:20。

  • 單位:%。

當前預設值表示,當謂詞的預估選擇率大於或等於20%時,系統將優先使用向量索引進行召回,隨後再進行謂詞過濾以獲得召回結果。

imci_enable_vector_search_inline_filter

包含謂詞的向量查詢使用內聯過濾(inline filter)的控制開關。

  • OFF(預設):關閉。

  • ON:開啟。

imci_vector_search_prefilter_rows

當謂詞過濾的預估匹配行數小於該參數值時,優先採用謂詞前置過濾的方式進行召回。

  • 取值範圍:0~UINT64_MAX。

  • 預設值:10000。

  • 單位:行數。

當前預設值表示,當謂詞過濾的預估匹配行數少於10000行時,將優先使用謂詞前置過濾方法召回匹配的記錄,隨後對這些記錄進行排序,並返回LIMIT指定的行數。

監控向量索引狀態

向量索引資料構建任務與列存索引資料快照推進屬於不同的背景工作。在持續寫入的情況下,向量索引快照位點可能會滯後於列存資料快照。在執行向量檢索之前,您需要確認向量索引的可用性。向量索引通過系統檢視表展示了向量索引的狀態,包括向量索引快照位點以及向量列上向量索引的狀態。

向量索引快照位點

INFORMATION_SCHEMA.IMCI_INDEX_STATS視圖中的VECTOR_ROWS列用於顯示列存索引已載入的向量索引快照中的向量數量。若該值為0,則表示當前列存索引上暫無可用的向量索引:可能是表中尚未存在任何向量索引,或是剛建立的向量索引尚未產生有效向量索引快照。

您還可以把該值與INFORMATION_SCHEMA.IMCI_INDEXES視圖中的ROW_ID列進行對比,以粗略評估向量索引資料的構建延遲。即便存在延遲情況,向量索引仍可正常使用;檢索時,系統會自動處理尚未寫入向量資料。

物理向量索引狀態

INFORMATION_SCHEMA.IMCI_VECTOR_INDEX_STATS系統檢視表展示了向量索引快照內部各個物理向量索引的狀態資訊,其表結構說明如下:

列名

說明

SCHEMA_NAME

庫名。

TABLE_NAME

表名。

COLUMN_NAME

向量列名。

VECTORS

向量索引中實際的向量數目,因為剔除了NULL標記值以及構建時已刪除的行,一般比VECTOR_ROWS小。

MEMORY_USAGE

記憶體用量。

STORAGE_USAGE

持久化檔案大小。

INDEX_TYPE

索引類型,目前僅支援HNSW。

INDEX_PARAMETERS

JSON表示的向量索引構建參數。

該視圖輸出的是每個開啟向量索引列對應的向量索引的記憶體狀態及統計資訊,與向量索引可用性沒有直接關聯。

說明
  • 任何未包含在該視圖查詢結果中的列,都無法進行近似向量檢索。

  • 在該視圖中,若VECTORS列顯示為 0,並不代表向量索引不可用。這通常是因為叢集重啟後尚未執行增量構建或近似查詢,向量索引的持久化資料尚未載入,因而暫時無法擷取準確的向量數量。請以系統檢視表INFORMATION_SCHEMA.IMCI_INDEX_STATS中的VECTOR_ROWS列作為向量快照的準確資訊來源。

操作樣本

  1. 為確保以下在少量資料的情況下能夠正常構建向量索引,需要在PolarDB控制台上將參數imci_vector_index_dump_rows_threshold設定為1。

  2. 建立測試表並插入資料:

    CREATE TABLE t1 (
        id int auto_increment PRIMARY KEY,
        v1 vector(4) COMMENT "imci_vector_index=HNSW(metric=COSINE,max_degree=16,ef_construction=300)"
    ) comment "COLUMNAR=1";
    
    INSERT INTO t1 VALUES(1, STRING_TO_VECTOR('[1.1,1.2,1.3,1.4]')), (2, STRING_TO_VECTOR('[2,2.2,2.4,2.6]'));
  3. 檢查索引快照狀態以及向量索引狀態:

    SELECT schema_name,table_name,row_id FROM information_schema.imci_indexes;
    +-------------+------------+--------+
    | schema_name | table_name | row_id |
    +-------------+------------+--------+
    | test        | t1         |      2 |
    +-------------+------------+--------+
    1 row in set (0.00 sec)
    
    SELECT schema_name,table_name,vector_rows FROM information_schema.imci_index_stats;
    +-------------+------------+-------------+
    | schema_name | table_name | vector_rows |
    +-------------+------------+-------------+
    | test        | t1         |           2 |
    +-------------+------------+-------------+
    1 row in set (0.00 sec)
    
    SELECT schema_name,table_name,column_name,vectors FROM information_schema.imci_vector_index_stats;
    +-------------+------------+-------------+---------+
    | schema_name | table_name | column_name | vectors |
    +-------------+------------+-------------+---------+
    | test        | t1         | v1          |       2 |
    +-------------+------------+-------------+---------+
    1 row in set (0.00 sec)
  4. 再執行如下寫入資料:

    INSERT INTO t1 VALUES(3, STRING_TO_VECTOR("[8.8,8.88,8.888,8.8888]"));

    可以觀察到INFORMATION_SCHEMA.IMCI_VECTOR_INDEX_STATS的相關查詢返回結果中VECTORS欄位的值為3(增加了1),表示上述INSERT的資料已被背景工作寫入向量索引中:

    SELECT schema_name,table_name,column_name,vectors FROM information_schema.imci_vector_index_stats;
    +-------------+------------+-------------+---------+
    | schema_name | table_name | column_name | vectors |
    +-------------+------------+-------------+---------+
    | test        | t1         | v1          |       3 |
    +-------------+------------+-------------+---------+
    1 row in set (0.00 sec)
  5. 接著重啟列存索引唯讀節點後檢查索引狀態:

    重要

    重啟列存索引唯讀節點會導致當前節點在短暫時間內不可用。

    SELECT schema_name,table_name,row_id,state FROM information_schema.imci_indexes;
    +-------------+------------+--------+-----------+
    | schema_name | table_name | row_id | state     |
    +-------------+------------+--------+-----------+
    | test        | t1         |      3 | COMMITTED |
    +-------------+------------+--------+-----------+
    1 row in set (0.00 sec)
    
    SELECT schema_name,table_name,vector_rows FROM information_schema.imci_index_stats;
    +-------------+------------+-------------+
    | schema_name | table_name | vector_rows |
    +-------------+------------+-------------+
    | test        | t1         |           3 |
    +-------------+------------+-------------+
    1 row in set (0.00 sec)
    
    SELECT schema_name,table_name,column_name,vectors FROM information_schema.imci_vector_index_stats;
    +-------------+------------+-------------+---------+
    | schema_name | table_name | column_name | vectors |
    +-------------+------------+-------------+---------+
    | test        | t1         | v1          |       0 |
    +-------------+------------+-------------+---------+
    1 row in set (0.00 sec)

    可以看到,IMCI_VECTOR_INDEX_STATS系統檢視表中VECTORS為0,同時向量索引快照位點為3。通過執行計畫來確認向量索引的可用性,並在執行近似查詢後再次檢查向量索引狀態:

    SET cost_threshold_for_imci = 0;
    
    
    EXPLAIN SELECT * FROM t1 ORDER BY DISTANCE(v1, STRING_TO_VECTOR("[1.2, 2.3, 3.4, 4.5]"), "COSINE") LIMIT 1;
    +----+-----------------------+------+--------+--------+---------------------------------------------------------------------------------------+
    | ID | Operator              | Name | E-Rows | E-Cost | Extra Info                                                                            |
    +----+-----------------------+------+--------+--------+---------------------------------------------------------------------------------------+
    |  1 | Select Statement      |      |        |        | IMCI Execution Plan (max_dop = 4, max_query_mem = 858993459)                          |
    |  2 | +-Compute Scalar      |      |        |        |                                                                                       |
    |  3 |   +-Limit             |      |        |        | Offset=0 Limit=1                                                                      |
    |  4 |     +-Sort            |      |        |        | Sort Key: VECTOR_DISTANCE(t1.v1,"[1.200000,2.300000,3.400000,4.500000]","COSINE") ASC |
    |  5 |       +-Vector Search | t1   |        |        |                                                                                       |
    +----+-----------------------+------+--------+--------+---------------------------------------------------------------------------------------+
    5 rows in set (0.00 sec)
    
    SELECT id, vector_to_string(v1) FROM t1 ORDER BY DISTANCE(v1, STRING_TO_VECTOR("[1.2, 2.3, 3.4, 4.5]"), "COSINE") LIMIT 1;
    +----+---------------------------------------------------+
    | id | vector_to_string(v1)                              |
    +----+---------------------------------------------------+
    |  2 | [2.00000e+00,2.20000e+00,2.40000e+00,2.60000e+00] |
    +----+---------------------------------------------------+
    1 row in set (0.00 sec)
    
    SELECT schema_name,table_name,column_name,vectors FROM information_schema.imci_vector_index_stats;
    +-------------+------------+-------------+---------+
    | schema_name | table_name | column_name | vectors |
    +-------------+------------+-------------+---------+
    | test        | t1         | v1          |       3 |
    +-------------+------------+-------------+---------+
    1 row in set (0.00 sec)

    可以觀察到執行近似查詢後向量索引被載入到記憶體,向量個數也恢複為3。

常見問題

為什麼向量查詢未使用索引?

請按以下步驟排查:

  1. 確認已在會話中執行SET imci_enable_vector_search = ON;SET cost_threshold_for_imci = 0;

  2. 使用EXPLAIN檢查執行計畫,確認Extra Info列中包含Vector Search運算元。

  3. 逐條核對SQL語句是否滿足近似最近鄰(ANN)檢索中列出的所有約束條件。常見錯誤是未使用LIMITORDER BY的排序方向錯誤。

  4. 檢查DISTANCE(...)運算式中的距離參數metric是否與建立向量索引時使用的距離參數metric完全一致。例如,如果向量索引採用COSINE距離構建,則DISTANCEE(...)也必須指定COSINE

建立向量時報錯ERROR 9040 (HY000): Data size exceeds VECTOR max,是什麼原因?

定義的向量維度超過了最大限制16383,請減小VECTOR(N)中的N值。

重啟列存索引唯讀節點後,監控顯示向量數量VECTORS為0,索引是否丟失?

索引沒有丟失。這是預期行為。索引資料持久化在磁碟上,重啟後需要通過第一次查詢來觸發載入到記憶體。請參考監控向量索引狀態中的診斷流程。

pq_m參數要求向量維度必須能被整除,如果維度是質數(如1023)怎麼辦?

在此情況下,無法使用FAISS_HNSW_PQ索引。有以下選擇:

  1. 選擇其他索引:使用HNSWFAISS_HNSW_FLAT,它們沒有此限制,但會佔用更多記憶體。

  2. 調整資料維度:在應用程式層通過降維或補齊的方式,將向量維度調整為能被pq_m(如8、16或32)整除的數值。