PolarDB for MySQL は、組み込みのベクトルデータ型、距離関数、およびベクトルインデックスを介して、SQL を使用した効率的なベクトル類似検索をサポートしています。この機能は、レコメンデーションシステム、チャットボット、画像検索などのアプリケーションに適しています。ベクトル計算機能はデータベースカーネルに統合されており、原子性、一貫性、隔離性、耐久性 (ACID) トランザクションをサポートし、インメモリ列インデックス (IMCI) や HNSW などのアルゴリズムを使用して、100% の取得率を持つ完全な k-最近傍 (KNN) 検索と、パフォーマンス専有型の近似最近傍 (ANN) 検索の両方を提供します。
適用範囲
この機能を使用する前に、クラスターが次のバージョン要件を満たしていることを確認してください: カーネルバージョンは MySQL 8.0.2、リビジョンバージョンは 8.0.2.2.30 以降である必要があります。
バージョン更新履歴
機能はカーネルバージョンによって異なります。クラスターを最新バージョンにアップグレードすることをお勧めします。
機能 | 最小カーネルバージョン要件 | 説明 |
基本的なベクトル機能と HNSW インデックスアルゴリズム。 | 8.0.2.2.30 | ベクトル検索の基本機能を提供します。 |
| 8.0.2.2.31 | FAISS 実装に基づくインデックスアルゴリズムを導入します。 |
ベクトルインデックスの変更または削除。 | 8.0.2.2.32 |
|
ベクトル型
型定義
CREATE TABLE または ALTER TABLE 文で VECTOR(N) 型を使用してベクトル列を定義できます。
Nはベクトルディメンションを表し、1 から 16,383 の範囲です。ベクトルの各ディメンションは、単精度浮動小数点数 (4 バイト) です。
ベクトル型は、他のベクトル型との等価比較のみをサポートし、他の型と比較することはできません。
ベクトル列は、プライマリキー、外部キー、ユニークキー、またはパーティションキーにはなれません。
例
-- 次の例では、テーブル t1 の列 v1 のベクトルディメンションを 4 として定義します。
CREATE TABLE t1 (id INT PRIMARY KEY, v1 VECTOR(4));16,383 より大きいディメンションを定義すると、エラー Data size (xxx Bytes, xxx dimensions) exceeds VECTOR max (65532 Bytes, 16383 dimensions) for column: 'xxx' が返されます。
型変換
PolarDB は、文字列形式とバイナリ形式を相互に変換するための STRING_TO_VECTOR および VECTOR_TO_STRING 関数を提供します。
文字列からバイナリへの変換 (STRING_TO_VECTOR)
この関数は、ベクトルをテキスト形式からデータベースの内部バイナリ形式に変換します。
入力形式: 角括弧 (
[]) で囲まれ、カンマ (,) で区切られた浮動小数点数のシーケンスです。例:'[1.2, 3.4, 5.6]'。説明入力文字列の形式が正しくない場合、エラー
Data cannot be converted to a valid vector: 'xxx'が返されます。バイトオーダー: 変換されたバイナリデータはリトルエンディアンバイトオーダーを使用します。たとえば、16 進数表現が
0x3F800000の浮動小数点数1.0は、バイナリ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 バイトごとに、リトルエンディアンバイトオーダーを使用して、ベクトルの 1 つのディメンションの浮動小数点数のバイナリ表現に対応します。たとえば、浮動小数点数 1.0 の 16 進数表現は 0x3F800000 です。データベースに格納されるとき、そのバイナリ HEX 値は 0000803F です。システム間でデータをシリアル化する際には、この点に注意してください。
入力バイナリの形式が正しくない場合、エラー 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]'));ベクトルをバイナリ形式で挿入します。
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 を使用して、ベクトルを文字列として更新します。ベクトルを直接バイナリ形式で更新することもできます。
UPDATE t1 SET v1 = STRING_TO_VECTOR('[1.0, 2.0, 3.0, 4.0]') WHERE id = 1;ベクトルの削除
STRING_TO_VECTOR を使用して、ベクトルを文字列として削除します。ベクトルを直接バイナリ形式で削除することもできます。
DELETE FROM t1 WHERE v1 = STRING_TO_VECTOR('[1.0, 2.0, 3.0, 4.0]');ベクトルインデックスの使用
PolarDB は、列の COMMENT に特別にフォーマットされた文字列を定義することで、ベクトルインデックスを作成します。
前提条件
ベクトルインデックスを使用する前に、インメモリ列インデックス (IMCI) の読み取り専用ノードを追加し、列またはテーブル全体に対して IMCI を作成する必要があります。IMCI 読み取り専用ノードのみが、ベクトル検索をサポートするためのベクトルインデックスを構築できます。
ベクトルインデックスの作成
CREATE TABLE または ALTER TABLE 文で列の COMMENT を変更することで、ベクトルインデックスを定義できます。
構文
COMMENT 'imci_vector_index=vector_index_algorithm(index_parameter_list) [other_comments]'imci_vector_index=: ベクトルインデックス定義を宣言する固定プレフィックス。vector_index_algorithm: インデックスアルゴリズム。例:HNSW、FAISS_HNSW_FLAT、FAISS_HNSW_PQ。index_parameter_list: 括弧で囲まれたインデックス構築パラメーター。複数のパラメーターは、スペース、カンマ、またはセミコロンで区切ることができます。混乱を避けるため、カンマを使用することをお勧めします。
単一パラメーターの形式は
parameter_name=parameter_valueまたはparameter_name:parameter_valueです。例:HNSW(metric=COSINE,max_degree=16,ef_construction=300)すべてのパラメーターがデフォルト値を使用する場合でも、括弧を含める必要があります。例:
COMMENT "imci_vector_index=HNSW() other_comments"
インデックスアルゴリズム
アルゴリズム | シナリオ |
| VSAG に基づいて実装されています。このアルゴリズムは高精度ですが、大量のメモリを消費します。 |
| FAISS に基づいて実装されています。このアルゴリズムは高精度ですが、大量のメモリを消費します。 |
| FAISS に基づいて実装されています。このアルゴリズムは、プロダクト量子化 (PQ) を使用してベクトルを圧縮します。これによりメモリ使用量は削減されますが、ある程度の精度損失が発生します。 |
インデックスパラメーター
パラメーター | 使用可能なエイリアス | 適用可能なアルゴリズム | 説明 | 有効な値/範囲 | デフォルト値 |
|
|
| ベクトル類似性メジャー。 |
説明 大文字の値のみがサポートされています。 |
|
|
|
| グラフ内の各ノードの最大接続数。 | 正の整数。値が大きいほどグラフは密になり、インデックス構築が遅くなりメモリ使用量が増加しますが、クエリの精度が向上する可能性があります。推奨範囲は 16 から 64 です。 | 16 |
| - |
| インデックス構築中に検索する近傍ノードの数。 | 正の整数。値が大きいほどインデックスの品質は向上しますが、構築時間は長くなります。推奨範囲は 100 から 500 です。 | 200 |
| - |
| プロダクト量子化 (PQ) の部分空間の数。 | ベクトルディメンションの約数である正の整数。ベクトルディメンションは | 1 |
| - |
| プロダクト量子化 (PQ) の各部分空間の量子化表現に使用されるビット数。 | 24 以下の正の整数。このパラメーターは通常 8 に設定され、各部分空間に 256 の重心があることを意味します。 | 8 |
例 1: テーブル作成時にベクトルインデックスを定義する
-- 方法 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';
-- 方法 2: 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)
);
-- 方法 1: テーブルレベルの列ストアインデックスを追加し、VECTOR 列の COMMENT を変更してベクトルインデックスのアルゴリズムとパラメーターを指定します。
ALTER TABLE t1 comment "COLUMNAR=1", MODIFY COLUMN v1 vector(4) COMMENT "imci_vector_index=HNSW(metric=COSINE,max_degree=16,ef_construction=300)";
-- 方法 2: v1 列に対してのみ列ストアインデックスを作成します。列ストアインデックスが初期化されると、v1 列の COMMENT に基づいてベクトルインデックスが自動的に作成されます。
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 | ベクトルインデックスの作成を許可するかどうかを指定します。
|
imci_vector_index_dump_rows_threshold | ベクトルインデックスの増分書き込みサイズを制御します。バックグラウンドタスクは、現在のベクトルインデックスのスナップショットオフセットと IMCI スナップショットオフセットの間の増分を定期的にチェックします。増分行数がこのしきい値を超えると、バックグラウンドタスクは新しいデータ行をベクトルインデックスに追加します。
|
ベクトルインデックスの変更
バージョン 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 BY句とLIMIT句の両方を含める必要があります。ORDER BY句の最初の式はDISTANCE(...)である必要があります。ORDER BY DISTANCE(...)のソート方向はASCである必要があります。DISTANCE(...)式のフィールドには、アクティブなベクトルインデックスが必要です。DISTANCE(...)式のmetricパラメーターは、ベクトルインデックスを作成したときに使用したmetricパラメーターと同じである必要があります。たとえば、ベクトルインデックスがCOSINE距離で構築された場合、DISTANCE(...)もCOSINEを指定する必要があります。クエリに
JOINが含まれている場合、実行計画は Right Deep Join Tree 構造を使用する必要があります。DISTANCE(...)式で参照されるフィールドは、JOIN の駆動テーブルのものである必要があります。クエリに
GROUP BY句を含めることはできません。集約を実行するには、サブクエリでベクトル検索を完了します。
ANN 検索を有効にする手順
ベクトルインデックスアクセラレーションを有効にします。
セッションで次のコマンドを実行して、オプティマイザーがベクトルインデックスを使用できるようにします。SET imci_enable_vector_search = ON;クエリに列ベースの実行計画を強制的に使用させます。
クエリが列ストアに構築されたベクトルインデックスにアクセスできるようにするには、クエリに列ストアパスを強制的に使用させる必要があります。SET cost_threshold_for_imci = 0;重要SET cost_threshold_for_imci = 0;はセッションレベルの設定であり、セッション内のすべてのクエリに列ストアインデックスを強制的に使用させます。これにより、プライマリキーを使用するポイントクエリなど、ローストアで効率的に実行されるクエリのパフォーマンスが低下する可能性があります。したがって、この設定はベクトル検索を実行するセッションでのみ使用してください。グローバルパラメーターとして設定しないでください。ANN トリガー条件を満たすクエリを記述します。
制約を満たす SQL 文を実行して、ベクトルインデックスを使用した ANN 検索を実行します。-- 最も類似した上位 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;EXPLAIN文を使用して、SQL 文に対して ANN 検索のベクトルインデックスアクセラレーションがアクティブであるかどうかを確認できます。実行計画に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 検索を高速化するためにベクトルインデックスを使用するかどうかを制御するスイッチ。
|
imci_hnswpq_k_factor | ベクトルインデックスが
説明 K 個の近似最近傍 (ANN) を取得するためのベクトルクエリを実行すると、エグゼキュータは HNSW PQ インデックスから |
ベクトルの表示
SELECT VECTOR_TO_STRING(v1) FROM t1;距離計算
DISTANCE 関数を使用して、指定された方法で 2 つのベクトル間の類似性を計算できます。
DISTANCE(vector1, vector2, '<metric>')metric パラメーター
パラメーター | 説明 |
| コサイン類似度。2 つのベクトル間の方向の類似性を測定します。結果は 2 つのベクトル間の角度のコサインです。値が小さいほど類似性が高くなります。 |
| ユークリッド距離。ユークリッド空間内の 2 つのベクトルまたは点間の直線距離を測定します。値が小さいほど類似性が高くなります。 |
| ドット積。2 つのベクトルの対応する成分を乗算し、それらを合計した結果。値が小さいほど類似性が高くなります。 |
例
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;述語を含むベクトルクエリの場合、特定のパラメーターを調整して、ベクトルインデックスの取得と述語フィルタリングの順序を制御できます。
実行戦略
ベクトル検索には、多くの場合、他のプロパティによるフィルタリングが含まれます。オプティマイザーは、フィルター条件の選択性に基づいて実行戦略をインテリジェントに選択します:
プレフィルター (prefilter): フィルター条件がデータ量を大幅に削減できる場合 (たとえば、一致する行数がデフォルトで 10,000 の
imci_vector_search_prefilter_rows未満の場合)、システムは最初にテーブル全体に述語フィルターを適用して一致するレコードを取得し、これらのレコードをソートしてから、LIMIT 句で指定されたレコード数を返します。ポストフィルター (postfilter): フィルター条件の選択性が低い場合 (たとえば、一致率がデフォルトで 20% の
imci_vector_search_filter_pctよりも高い場合)、システムは最初にベクトルインデックスを使用して結果を取得し、次に取得した結果に対して述語フィルタリングを実行します。フィルター処理された結果の数が LIMIT 句で指定された数より少ない場合、この手順が繰り返されます。インラインフィルター: オプティマイザーがプレフィルターまたはポストフィルター戦略を選択しない場合、インラインフィルター戦略を使用します。システムは最初に述語を使用してテーブル全体をフィルター処理し、一致するレコードの RowID から
bitmapフィルターを構築します。次に、ベクトルインデックスを使用して取得します。ベクトルインデックスの取得プロセス中、システムはbitmapフィルターを使用して、返された最も類似したレコードが述語条件を満たしていることを確認します。
適応実行最適化
述語フィルターによって一致する行数のオプティマイザーの推定には、バイアスが生じる可能性があります。これにより、最適でない実行戦略が選択される可能性があります。適応実行メカニズムは、実際の一致行数に基づいて、実行時に実行戦略を動的に切り替えます。
インラインフィルター戦略を使用して述語付きのベクトルクエリを実行しているときに、述語がテーブル全体に適用された後の実際の一致レコード数が imci_vector_search_prefilter_rows 未満の場合、システムは動的にプレフィルター戦略に切り替えます。
パーティション最適化
ベクトルクエリには、テナント ID やタグなどの述語条件が含まれることがよくあります。これらのクエリには、LIST DEFAULT HASH パーティション分割メソッドを使用できます。データ量の多いテナントやタグには個別の LIST パーティションを作成し、他のテナントやタグには DEFAULT HASH パーティションを使用できます。オプティマイザーはこれらのクエリを検出できます。パーティションプルーニングの結果に基づいて、オプティマイザーは大規模なテナントやタグのベクトルクエリに対してポストフィルター戦略を選択します。他のテナントには、プレフィルターまたはインラインフィルター戦略を使用します。これにより、さまざまなサイズのテナントやタグに最適な実行戦略を選択できます。
パラメーターの説明
パラメーター | 説明 |
imci_vector_search_filter_pct | 述語フィルターの推定選択性がこの値以上の場合、システムはベクトルインデックスの取得を優先します。
デフォルト値の 20 は、述語の推定選択性が 20% 以上の場合、システムは最初にベクトルインデックスを使用して結果を取得し、次に述語フィルターを適用することを意味します。 |
imci_enable_vector_search_inline_filter | 述語を含むベクトルクエリにインラインフィルター戦略を使用するかどうかを制御します。
|
imci_vector_search_prefilter_rows | 述語フィルターからの一致する行の推定数がこの値未満の場合、システムはプレフィルター取得メソッドを優先します。
デフォルト値の 10,000 は、述語フィルターからの一致する行の推定数が 10,000 未満の場合、システムがプレフィルターメソッドを優先することを意味します。一致するレコードを取得し、それらをソートしてから、LIMIT 句で指定された行数を返します。 |
ベクトルインデックスのステータスの監視
ベクトルインデックスデータの構築と列ストアインデックススナップショットの進行は、別々のバックグラウンドタスクです。継続的な書き込みにより、ベクトルインデックスのスナップショットオフセットが列ストアデータスナップショットより遅れる可能性があります。ベクトル検索を実行する前に、ベクトルインデックスが利用可能であることを確認する必要があります。ベクトルインデックスのステータスはシステムビューに表示されます。これには、スナップショットオフセットとベクトル列のインデックスのステータスが含まれます。
ベクトルインデックスのスナップショットオフセット
INFORMATION_SCHEMA.IMCI_INDEX_STATS ビューの VECTOR_ROWS 列は、列ストアインデックスによってロードされたスナップショット内のベクトル数を示します。値が 0 の場合は、現在の列ストアインデックスで利用可能なベクトルインデックスがないことを意味します。これは、テーブルにベクトルインデックスがない場合、または新しいインデックスがまだ有効なスナップショットを生成していない場合に発生する可能性があります。
この値を INFORMATION_SCHEMA.IMCI_INDEXES ビューの ROW_ID 列と比較して、ベクトルインデックスデータの構築レイテンシを推定することもできます。ベクトルインデックスはレイテンシがあっても機能します。検索中、システムはインデックスに書き込まれていないベクトルデータを自動的に処理します。
物理ベクトルインデックスのステータス
INFORMATION_SCHEMA.IMCI_VECTOR_INDEX_STATS システムビューは、ベクトルインデックススナップショット内の各物理ベクトルインデックスのステータスを示します。テーブルスキーマは次のとおりです:
列名 | 説明 |
| DB 名。 |
| テーブル名。 |
| ベクトル列名。 |
| ベクトルインデックス内の実際のベクトル数。この値は通常、NULL 値や構築中に削除された行が除外されるため、VECTOR_ROWS よりも小さくなります。 |
| メモリ使用量。 |
| 永続ファイルのサイズ。 |
| インデックスタイプ。現在、HNSW のみがサポートされています。 |
| JSON 形式のベクトルインデックス構築パラメーター。 |
このビューは、ベクトルインデックスが有効になっている各列のベクトルインデックスのメモリスータスと統計を出力します。この情報は、ベクトルインデックスの可用性とは直接関係ありません。
このビューのクエリ結果に含まれていない列では、近似ベクトル検索を実行できません。
このビューでは、
VECTORS列の値が 0 であっても、ベクトルインデックスが利用できないことを意味するわけではありません。これは通常、クラスターの再起動後、増分ビルドまたは近似クエリがまだ実行されていない場合に発生します。ベクトルインデックスの永続データがロードされていないため、正確なベクトル数は一時的に利用できません。正確なベクトルスナップショット情報については、INFORMATION_SCHEMA.IMCI_INDEX_STATSシステムビューのVECTOR_ROWS列を使用してください。
例
少量のデータでもベクトルインデックスが正常に構築されるようにするには、PolarDB コンソールで
imci_vector_index_dump_rows_thresholdパラメーターを 1 に設定する必要があります。テストテーブルを作成してデータを挿入します:
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]'));インデックススナップショットのステータスとベクトルインデックスのステータスを確認します:
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)さらにデータを挿入します:
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 増加しました。これは、バックグラウンドタスクが挿入されたデータをベクトルインデックスに書き込んだことを示しています: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)列ストアインデックスの読み取り専用ノードを再起動し、インデックスのステータスを確認します:
重要列ストアインデックスの読み取り専用ノードを再起動すると、現在のノードが短時間利用できなくなります。
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 に復元されます。