すべてのプロダクト
Search
ドキュメントセンター

PolarDB:MySQL プロトコルを使用したベクトル検索の実行

最終更新日:Nov 09, 2025

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

ベクトル検索の基本機能を提供します。

FAISS_HNSW_FLAT および FAISS_HNSW_PQ インデックスアルゴリズムを追加します。

8.0.2.2.31

FAISS 実装に基づくインデックスアルゴリズムを導入します。

ベクトルインデックスの変更または削除。

8.0.2.2.32

ALTER TABLE を使用してベクトルインデックスを動的に管理できます。

ベクトル型

型定義

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 は、バイナリ HEX0000803F でデータベースに格納されます。システム間でデータをシリアル化する際には、この点に注意してください。

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: インデックスアルゴリズム。例: HNSWFAISS_HNSW_FLATFAISS_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"

インデックスアルゴリズム

アルゴリズム

シナリオ

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) の各部分空間の量子化表現に使用されるビット数。

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

ベクトルインデックスの作成を許可するかどうかを指定します。

  • ON (デフォルト): 有効にすると、IMCI 読み取り専用ノードは IMCI 作成中にベクトル列のコメントに基づいてベクトルインデックスを作成します。

  • OFF: 無効にすると、IMCI 読み取り専用ノードは IMCI 作成中にベクトル列のベクトルインデックスを作成しなくなります。既存のベクトルインデックスは引き続き構築されますが、再起動後はロードまたは構築されません。

imci_vector_index_dump_rows_threshold

ベクトルインデックスの増分書き込みサイズを制御します。バックグラウンドタスクは、現在のベクトルインデックスのスナップショットオフセットと IMCI スナップショットオフセットの間の増分を定期的にチェックします。増分行数がこのしきい値を超えると、バックグラウンドタスクは新しいデータ行をベクトルインデックスに追加します。

  • 有効値: 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 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 検索を有効にする手順

  1. ベクトルインデックスアクセラレーションを有効にします。
    セッションで次のコマンドを実行して、オプティマイザーがベクトルインデックスを使用できるようにします。

    SET imci_enable_vector_search = ON;
  2. クエリに列ベースの実行計画を強制的に使用させます。
    クエリが列ストアに構築されたベクトルインデックスにアクセスできるようにするには、クエリに列ストアパスを強制的に使用させる必要があります。

    SET cost_threshold_for_imci = 0;
    重要

    SET cost_threshold_for_imci = 0; はセッションレベルの設定であり、セッション内のすべてのクエリに列ストアインデックスを強制的に使用させます。これにより、プライマリキーを使用するポイントクエリなど、ローストアで効率的に実行されるクエリのパフォーマンスが低下する可能性があります。したがって、この設定はベクトル検索を実行するセッションでのみ使用してください。グローバルパラメーターとして設定しないでください。

  3. 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;
  4. 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 検索を高速化するためにベクトルインデックスを使用するかどうかを制御するスイッチ。

  • 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 関数を使用して、指定された方法で 2 つのベクトル間の類似性を計算できます。

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

metric パラメーター

パラメーター

説明

COSINE

コサイン類似度。2 つのベクトル間の方向の類似性を測定します。結果は 2 つのベクトル間の角度のコサインです。値が小さいほど類似性が高くなります。

EUCLIDEAN

ユークリッド距離。ユークリッド空間内の 2 つのベクトルまたは点間の直線距離を測定します。値が小さいほど類似性が高くなります。

DOT

ドット積。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

述語フィルターの推定選択性がこの値以上の場合、システムはベクトルインデックスの取得を優先します。

  • 値の範囲: 0 から 100。

  • デフォルト値: 20。

  • 単位: %。

デフォルト値の 20 は、述語の推定選択性が 20% 以上の場合、システムは最初にベクトルインデックスを使用して結果を取得し、次に述語フィルターを適用することを意味します。

imci_enable_vector_search_inline_filter

述語を含むベクトルクエリにインラインフィルター戦略を使用するかどうかを制御します。

  • OFF (デフォルト): 無効。

  • ON: 有効。

imci_vector_search_prefilter_rows

述語フィルターからの一致する行の推定数がこの値未満の場合、システムはプレフィルター取得メソッドを優先します。

  • 値の範囲: 0 から UINT64_MAX。

  • デフォルト値: 10000。

  • 単位: 行。

デフォルト値の 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 システムビューは、ベクトルインデックススナップショット内の各物理ベクトルインデックスのステータスを示します。テーブルスキーマは次のとおりです:

列名

説明

SCHEMA_NAME

DB 名。

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 増加しました。これは、バックグラウンドタスクが挿入されたデータをベクトルインデックスに書き込んだことを示しています:

    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 に復元されます。

FAQ

ベクトルクエリでインデックスが使用されないのはなぜですか?

次の手順に従ってトラブルシューティングを行ってください:

  1. セッションで SET imci_enable_vector_search = ON;SET cost_threshold_for_imci = 0; を実行したことを確認してください。

  2. EXPLAIN を使用して実行計画を確認できます。Extra Info 列に Vector Search オペレーターが含まれていることを確認してください。

  3. SQL 文が「近似最近傍 (ANN) 検索」に記載されているすべての制約を満たしていることを確認してください。一般的なエラーには、LIMIT を使用していない、または ORDER BY で誤ったソート方向を使用しているなどがあります。

  4. DISTANCE(...) 式の metric パラメーターが、ベクトルインデックスの作成に使用した metric パラメーターと同一であることを確認してください。たとえば、ベクトルインデックスが COSINE 距離で構築された場合、DISTANCE(...)COSINE を指定する必要があります。

ベクトルを作成するときにエラー ERROR 9040 (HY000): Data size exceeds VECTOR max が表示されるのはなぜですか?

定義されたベクトルディメンションが最大制限の 16,383 を超えています。VECTOR(N) の N の値を小さくしてください。

列ストアインデックスの読み取り専用ノードを再起動した後、モニタリングデータに VECTORS のカウントが 0 と表示されます。インデックスは失われましたか?

いいえ、インデックスは失われていません。これは期待される動作です。インデックスデータはディスクに永続化されます。再起動後、最初のクエリがデータをメモリにロードするトリガーとなります。詳細については、「ベクトルインデックスのステータスの監視」をご参照ください。

pq_m パラメーターでは、ベクトルディメンションが pq_m で割り切れる必要があります。ディメンションが 1023 のような素数の場合はどうすればよいですか?

この場合、FAISS_HNSW_PQ インデックスは使用できません。次の選択肢があります:

  1. 別のインデックスを選択します。HNSW または FAISS_HNSW_FLAT を使用できます。これらのインデックスにはこの制限はありませんが、より多くのメモリを消費します。

  2. データディメンションを調整します。アプリケーション層で、ディメンション削減またはパディングを使用して、ベクトルディメンションを 8、16、32 など、pq_m で割り切れる値に調整できます。