ベクトル検索のパフォーマンスを向上させる
TiDB ベクトル検索を使用すると、画像、ドキュメント、またはその他の入力に類似した結果を検索する近似最近傍 (ANN) クエリを実行できます。クエリのパフォーマンスを向上させるには、次のベスト プラクティスを確認してください。
ベクトル列にベクトル検索インデックスを追加する
ベクトル検索インデックスは、リコール率がわずかに低下するだけのトレードオフで、ベクトル検索クエリのパフォーマンスを通常 10 倍以上大幅に向上させます。
ベクトルインデックスが完全に構築されていることを確認する
大量のベクター データを挿入すると、その一部がデルタレイヤーで永続化を待機している可能性があります。このようなデータのベクトル インデックスは、データが永続化された後に構築されます。すべてのベクター データがインデックス化されるまで、ベクター検索のパフォーマンスは最適ではありません。インデックス構築の進行状況を確認するには、 インデックス構築の進行状況をビュー参照してください。
ベクトルの次元を減らすか埋め込みを短くする
ベクトルの次元が大きくなるにつれて、ベクトル検索のインデックス作成とクエリの計算の複雑さが大幅に増加し、より多くの浮動小数点の比較が必要になります。
パフォーマンスを最適化するには、可能な限りベクトル次元を減らすことを検討してください。通常、これには別の埋め込みモデルへの切り替えが必要です。モデルを切り替えるときは、モデルの変更がベクトル クエリの精度に与える影響を評価する必要があります。
OpenAI text-embedding-3-large
などの特定の埋め込みモデルは埋め込みの短縮サポートしています。これは、埋め込みの概念表現プロパティを失うことなく、ベクトルシーケンスの末尾からいくつかの数字を削除します。このような埋め込みモデルを使用して、ベクトルの次元を削減することもできます。
結果からベクター列を除外する
ベクター埋め込みデータは通常大きく、検索プロセス中にのみ使用されます。クエリ結果からベクター列を除外すると、TiDBサーバーと SQL クライアント間で転送されるデータが大幅に削減され、クエリのパフォーマンスが向上します。
ベクター列を除外するには、 SELECT *
使用してすべての列を取得するのではなく、 SELECT
句で取得する列を明示的にリストします。
インデックスをウォームアップする
一度も使用されていない、または長期間アクセスされていないインデックスにアクセスする場合 (コールド アクセス)、TiDB はインデックス全体をクラウドstorageまたはディスク (メモリではなく) から読み込む必要があります。このプロセスには時間がかかり、多くの場合、クエリのレイテンシーが長くなります。さらに、長期間 (たとえば、数時間) SQL クエリがない場合、コンピューティング リソースが再利用され、後続のアクセスがコールド アクセスになります。
このようなクエリのレイテンシーを回避するには、実際のワークロードの前に、ベクトル インデックスにヒットする同様のベクトル検索クエリを実行して、インデックスをウォームアップします。