全部产品
Search
文档中心

PolarDB:Lakukan pengambilan vektor menggunakan protokol MySQL

更新时间:Nov 11, 2025

PolarDB for MySQL mendukung pencarian kemiripan vektor yang efisien melalui SQL dengan memanfaatkan tipe data vektor bawaan, fungsi jarak, dan indeks vektor. Fitur ini cocok untuk aplikasi seperti sistem rekomendasi, chatbot, dan pengambilan citra. Kemampuan komputasi vektor diintegrasikan ke dalam kernel database, mendukung transaksi atomicity, consistency, isolation, dan durability (ACID), serta menggunakan In-Memory Column Index (IMCI) dan algoritma seperti HNSW untuk menyediakan baik pencarian k-nearest neighbor (KNN) tepat dengan recall 100% maupun pencarian approximate nearest neighbor (ANN) berkinerja tinggi.

Cakupan

Sebelum menggunakan fitur ini, pastikan kluster Anda memenuhi persyaratan versi berikut: Versi kernel harus MySQL 8.0.2, dan versi revisi harus 8.0.2.2.30 atau lebih baru.

Riwayat pembaruan versi

Fitur bervariasi tergantung pada versi kernel. Kami menyarankan Anda meningkatkan kluster ke versi terbaru.

Fitur

Persyaratan versi kernel minimum

Deskripsi

Fitur vektor dasar dan algoritma indeks HNSW.

8.0.2.2.30

Menyediakan kemampuan dasar untuk pengambilan vektor.

Menambahkan algoritma indeks FAISS_HNSW_FLAT dan FAISS_HNSW_PQ.

8.0.2.2.31

Memperkenalkan algoritma indeks berdasarkan implementasi FAISS.

Ubah atau hapus indeks vektor.

8.0.2.2.32

Memungkinkan Anda mengelola indeks vektor secara dinamis menggunakan ALTER TABLE.

Tipe vektor

Definisi tipe

Anda dapat menggunakan pernyataan CREATE TABLE atau ALTER TABLE dengan tipe VECTOR(N) untuk mendefinisikan kolom vektor.

  • N merepresentasikan dimensi vektor, yang dapat berkisar dari 1 hingga 16.383.

  • Setiap dimensi vektor adalah bilangan titik mengambang presisi tunggal (4 byte).

  • Tipe vektor hanya mendukung perbandingan kesetaraan dengan tipe vektor lainnya dan tidak dapat dibandingkan dengan tipe apa pun lainnya.

  • Kolom vektor tidak dapat menjadi kunci primer, kunci asing, kunci unik, atau kunci partisi.

Contoh

-- Contoh berikut mendefinisikan dimensi vektor kolom v1 pada tabel t1 sebagai 4.
CREATE TABLE t1 (id INT PRIMARY KEY, v1 VECTOR(4));
Catatan

Jika Anda mendefinisikan dimensi lebih besar dari 16.383, kesalahan Data size (xxx Bytes, xxx dimensions) exceeds VECTOR max (65532 Bytes, 16383 dimensions) for column: 'xxx' akan dikembalikan.

Konversi tipe

PolarDB menyediakan fungsi STRING_TO_VECTOR dan VECTOR_TO_STRING untuk mengonversi antara format string dan biner.

Konversi string ke biner (STRING_TO_VECTOR)

Fungsi ini mengonversi vektor dari format teks ke format biner internal database.

  • Format input: Urutan bilangan titik mengambang yang diapit tanda kurung siku ([]) dan dipisahkan koma (,), seperti '[1.2, 3.4, 5.6]'.

    Catatan

    Jika string input memiliki format salah, kesalahan Data cannot be converted to a valid vector: 'xxx' akan dikembalikan.

  • Urutan byte: Data biner yang dikonversi menggunakan urutan byte little-endian. Misalnya, bilangan titik mengambang 1.0, yang memiliki representasi heksadesimal 0x3F800000, disimpan dalam database dengan nilai biner HEX sebesar 0000803F. Perhatikan hal ini saat melakukan serialisasi data lintas sistem.

Contoh

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   |
+------------------------------------+

Konversi biner ke string (VECTOR_TO_STRING)

Fungsi ini mengonversi data vektor biner yang disimpan dalam database ke format string.

Format input: Setiap 4 byte merepresentasikan representasi biner bilangan titik mengambang untuk satu dimensi vektor, menggunakan urutan byte little-endian. Misalnya, bilangan titik mengambang 1.0 memiliki representasi heksadesimal 0x3F800000. Saat disimpan dalam database, nilai biner HEX-nya adalah 0000803F. Perhatikan hal ini saat melakukan serialisasi data lintas sistem.

Catatan

Jika data biner input memiliki format salah, kesalahan Data cannot be converted to a valid vector: '' akan dikembalikan.

Contoh

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

Contoh operasi terkait

Buat tabel baru yang berisi kolom vektor

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

Tambahkan kolom vektor ke tabel yang sudah ada

ALTER TABLE t1 ADD COLUMN v1 VECTOR(4);

Masukkan vektor

  • Masukkan vektor sebagai string menggunakan fungsi STRING_TO_VECTOR.

    INSERT INTO t1 (id, v1) VALUES (1, STRING_TO_VECTOR('[1.0, 2.0, 3.0, 4.0]'));
  • Masukkan vektor dalam format biner.

    INSERT INTO t1 VALUES (2, 0x0000803F000000400000404000008040);

Masukkan atau perbarui vektor

Masukkan atau perbarui vektor sebagai string menggunakan 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]');

Perbarui vektor

Perbarui vektor sebagai string menggunakan STRING_TO_VECTOR. Anda juga dapat memperbarui vektor langsung dalam format biner.

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

Hapus vektor

Hapus vektor sebagai string menggunakan STRING_TO_VECTOR. Anda juga dapat menghapus vektor langsung dalam format biner.

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

Menggunakan indeks vektor

PolarDB membuat indeks vektor dengan mendefinisikan string berformat khusus dalam atribut COMMENT kolom.

Prasyarat

Sebelum dapat menggunakan indeks vektor, Anda harus menambahkan node read-only untuk In-Memory Column Index (IMCI) dan membuat IMCI untuk kolom tersebut atau seluruh tabel. Hanya node read-only IMCI yang dapat membangun indeks vektor untuk mendukung pencarian vektor.

Buat indeks vektor

Anda dapat mendefinisikan indeks vektor dengan memodifikasi atribut COMMENT kolom dalam pernyataan CREATE TABLE atau ALTER TABLE.

Sintaks

COMMENT 'imci_vector_index=vector_index_algorithm(index_parameter_list) [other_comments]'
  • imci_vector_index=: Awalan tetap yang mendeklarasikan definisi indeks vektor.

  • vector_index_algorithm: Algoritma indeks, seperti HNSW, FAISS_HNSW_FLAT, atau FAISS_HNSW_PQ.

  • index_parameter_list: Parameter pembuatan indeks, diapit tanda kurung.

    • Anda dapat memisahkan beberapa parameter dengan spasi, koma, atau titik koma. Untuk menghindari kebingungan, kami menyarankan Anda menggunakan koma.

    • Format untuk satu parameter adalah parameter_name=parameter_value atau parameter_name:parameter_value. Contoh: HNSW(metric=COSINE,max_degree=16,ef_construction=300)

    • Jika semua parameter menggunakan nilai default, Anda tetap harus menyertakan tanda kurung. Contoh: COMMENT "imci_vector_index=HNSW() other_comments"

Algoritma indeks

Algoritma

Skenario

HNSW

Diimplementasikan berdasarkan VSAG. Algoritma ini memberikan presisi tinggi tetapi mengonsumsi banyak memori.

FAISS_HNSW_FLAT

Diimplementasikan berdasarkan FAISS. Algoritma ini memberikan presisi tinggi tetapi mengonsumsi banyak memori.

FAISS_HNSW_PQ

Diimplementasikan berdasarkan FAISS. Algoritma ini menggunakan kuantisasi produk (PQ) untuk mengompresi vektor. Hal ini mengurangi penggunaan memori tetapi menyebabkan sedikit kehilangan presisi.

Parameter indeks

Parameter

Alias yang tersedia

Algoritma yang berlaku

Deskripsi

Nilai/rentang yang valid

Nilai default

metric

distance

  • HNSW

  • FAISS_HNSW_FLAT

  • FAISS_HNSW_PQ

Ukuran kemiripan vektor.

  • COSINE (jarak cosinus)

  • INNER_PRODUCT (hasil kali dalam)

  • EUCLIDEAN (Jarak Euclidean)

Catatan

Hanya nilai huruf kapital yang didukung.

COSINE

max_degree

M

  • HNSW

  • FAISS_HNSW_FLAT

  • FAISS_HNSW_PQ

Jumlah maksimum koneksi untuk setiap node dalam graf.

Bilangan bulat positif. Nilai yang lebih besar membuat graf lebih padat, yang memperlambat pembuatan indeks dan meningkatkan penggunaan memori, tetapi mungkin meningkatkan presisi kueri. Rentang yang direkomendasikan adalah 16 hingga 64.

16

ef_construction

-

  • HNSW

  • FAISS_HNSW_FLAT

  • FAISS_HNSW_PQ

Jumlah node tetangga yang dicari selama pembuatan indeks.

Bilangan bulat positif. Nilai yang lebih besar meningkatkan kualitas indeks tetapi memperpanjang waktu pembuatan. Rentang yang direkomendasikan adalah 100 hingga 500.

200

pq_m

-

FAISS_HNSW_PQ

Jumlah subruang untuk kuantisasi produk (PQ).

Bilangan bulat positif yang merupakan pembagi dari dimensi vektor. Dimensi vektor harus habis dibagi oleh pq_m. Nilai yang lebih besar memberikan presisi lebih tinggi tetapi juga meningkatkan penggunaan memori.

1

pq_nbits

-

FAISS_HNSW_PQ

Jumlah bit yang digunakan untuk representasi terkuantisasi setiap subruang dalam kuantisasi produk (PQ).

Bilangan bulat positif kurang dari atau sama dengan 24. Parameter ini biasanya diatur ke 8, yang berarti setiap subruang memiliki 256 pusat.

8

Contoh 1: Definisikan indeks vektor saat membuat tabel

-- Metode 1: Aktifkan penyimpanan kolom untuk seluruh tabel, lalu definisikan indeks vektor pada kolom v1.
CREATE TABLE t1 (
    id INT PRIMARY KEY,
    v1 VECTOR(4) COMMENT 'imci_vector_index=HNSW(metric=COSINE, max_degree=16)'
) COMMENT 'COLUMNAR=1';

-- Metode 2: Aktifkan penyimpanan kolom dan indeks vektor hanya untuk kolom v1.
CREATE TABLE t1 (
    id INT PRIMARY KEY,
    description TEXT,
    v1 VECTOR(4) COMMENT 'COLUMNAR=1, imci_vector_index=HNSW(metric=COSINE)'
);

Contoh 2: Tambahkan indeks vektor ke tabel yang sudah ada

-- Asumsikan tabel yang sudah ada adalah t1.
CREATE TABLE t1 (
    id int auto_increment PRIMARY KEY,
    v1 vector(4)
);

-- Metode 1: Tambahkan indeks penyimpanan kolom tingkat tabel dan modifikasi COMMENT kolom VECTOR untuk menentukan algoritma dan parameter indeks vektor.
ALTER TABLE t1 comment "COLUMNAR=1", MODIFY COLUMN v1 vector(4) COMMENT "imci_vector_index=HNSW(metric=COSINE,max_degree=16,ef_construction=300)";


-- Metode 2: Buat indeks penyimpanan kolom hanya untuk kolom v1. Saat indeks penyimpanan kolom diinisialisasi, indeks vektor akan dibuat otomatis berdasarkan COMMENT kolom v1.
ALTER TABLE t1 MODIFY COLUMN v1 vector(4) COMMENT "COLUMNAR=1 imci_vector_index=HNSW(metric=COSINE,max_degree=16,ef_construction=300)";

Parameter

Parameter

Deskripsi

imci_enable_inline_vector_index

Menentukan apakah pembuatan indeks vektor diizinkan.

  • ON (Default): Saat diaktifkan, node read-only IMCI membuat indeks vektor berdasarkan komentar kolom vektor selama pembuatan IMCI.

  • OFF: Saat dinonaktifkan, node read-only IMCI tidak lagi membuat indeks vektor untuk kolom vektor selama pembuatan IMCI. Indeks vektor yang sudah ada tetap dibangun, tetapi tidak dimuat atau dibangun setelah restart.

imci_vector_index_dump_rows_threshold

Mengontrol ukuran penulisan bertahap untuk indeks vektor. Tugas latar belakang secara berkala memeriksa peningkatan antara offset snapshot indeks vektor saat ini dan offset snapshot IMCI. Ketika jumlah baris bertahap melebihi ambang batas ini, tugas latar belakang menambahkan baris data baru ke indeks vektor.

  • Nilai yang valid: 1 hingga 4294967295.

  • Nilai default: 1000.

  • Unit: baris.

Ubah indeks vektor

Catatan

Versi 8.0.2.2.32 dan yang lebih baru mendukung pengubahan algoritma dan parameter indeks vektor dengan mengubah komentar pada kolom vektor.

  • Ubah algoritma indeks vektor.

    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';
    
    -- Ubah algoritma indeks dari HNSW ke algoritma HNSW berbasis FAISS.
    ALTER TABLE t1 modify column v1 vector(4) COMMENT "imci_vector_index=FAISS_HNSW_FLAT(metric=COSINE,max_degree=16,ef_construction=300)";
  • Ubah parameter indeks vektor.

    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';
    
    -- Ubah parameter indeks. Ubah max_degree HNSW dari 16 menjadi 32.
    ALTER TABLE t1 modify column v1 vector(4) COMMENT "imci_vector_index=HNSW(metric=COSINE,max_degree=32,ef_construction=300)";

Hapus indeks vektor

  • Hapus indeks vektor saat menghapus indeks penyimpanan kolom.

    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';
    
    -- Indeks vektor tidak dapat eksis secara independen dari indeks penyimpanan kolom dan dihapus melalui penghapusan bertingkat.
    ALTER TABLE t1 COMMENT 'COLUMNAR=0';
  • Hapus hanya indeks vektor.

    Catatan

    Versi 8.0.2.2.32 dan yang lebih baru mendukung penghapusan indeks vektor dengan menghapus komentar pada kolom vektor.

    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';
    
    -- Hapus indeks vektor dengan menghapus komentar pada kolom tipe vektor.
    ALTER TABLE t1 modify column v1 vector(4) COMMENT "";

Kueri vektor

Pencarian Tetangga Terdekat Hampiran (ANN)

Pencarian Tetangga Terdekat Hampiran (ANN) menggunakan indeks vektor untuk mempercepat kueri.

Batasan

Pengoptimal hanya menggunakan indeks vektor ketika mendeteksi pola SQL tertentu. Kueri harus memenuhi semua kondisi berikut:

  • Kueri harus mencakup klausa ORDER BY dan LIMIT.

  • Ekspresi pertama dalam klausa ORDER BY harus berupa DISTANCE(...).

  • Arah pengurutan untuk ORDER BY DISTANCE(...) harus ASC.

  • Bidang dalam ekspresi DISTANCE(...) harus memiliki indeks vektor aktif.

  • Parameter metric dalam ekspresi DISTANCE(...) harus sama dengan parameter metric yang digunakan saat Anda membuat indeks vektor. Misalnya, jika indeks vektor dibangun dengan jarak COSINE, DISTANCE(...) juga harus menentukan COSINE.

  • Jika kueri mencakup JOIN, rencana eksekusi harus menggunakan struktur Right Deep Join Tree. Bidang yang dirujuk dalam ekspresi DISTANCE(...) harus berasal dari tabel penggerak JOIN.

  • Kueri tidak boleh mengandung klausa GROUP BY. Untuk melakukan agregasi, Anda dapat menyelesaikan pengambilan vektor dalam subkueri.

Langkah-langkah untuk mengaktifkan pencarian ANN

  1. Aktifkan akselerasi indeks vektor.
    Jalankan perintah berikut dalam sesi untuk mengizinkan pengoptimal menggunakan indeks vektor.

    SET imci_enable_vector_search = ON;
  2. Paksa kueri menggunakan rencana eksekusi berbasis kolom.
    Untuk memastikan kueri dapat mengakses indeks vektor yang dibangun pada penyimpanan kolom, Anda harus memaksa kueri menggunakan jalur penyimpanan kolom.

    SET cost_threshold_for_imci = 0;
    Penting

    SET cost_threshold_for_imci = 0; adalah pengaturan tingkat sesi yang memaksa semua kueri dalam sesi menggunakan indeks penyimpanan kolom. Hal ini dapat menurunkan kinerja kueri yang seharusnya berjalan efisien pada penyimpanan baris, seperti kueri titik yang menggunakan kunci primer. Oleh karena itu, gunakan pengaturan ini hanya dalam sesi yang melakukan pengambilan vektor. Jangan atur sebagai parameter global.

  3. Tulis kueri yang memenuhi kondisi pemicu ANN.
    Jalankan pernyataan SQL yang memenuhi batasan untuk melakukan pencarian ANN dengan indeks vektor.

    -- Temukan 5 catatan paling mirip
    SELECT id, v1
    FROM t1
    WHERE category_id = 123 -- Kondisi tambahan dapat ditambahkan
    ORDER BY DISTANCE(v1, STRING_TO_VECTOR('[...]'), 'COSINE') ASC
    LIMIT 5;

    Memperbaiki kueri yang tidak sesuai (menggunakan GROUP BY sebagai contoh):

    -- Salah: GROUP BY bertentangan dengan ORDER BY DISTANCE()
    -- SELECT category_id, COUNT(*) FROM t1 GROUP BY category_id ORDER BY DISTANCE(v1, STRING_TO_VECTOR('[...]'), 'COSINE') ASC LIMIT 5;
    
    -- Benar: Pertama lakukan pencarian ANN dalam subkueri, lalu agregasi hasilnya
    SELECT category_id, COUNT(*)
    FROM (
        SELECT id, category_id
        FROM t1
        ORDER BY DISTANCE(v1, STRING_TO_VECTOR('[...]'), 'COSINE') ASC
        LIMIT 100 -- Pertama ambil 100 tetangga terdekat
    ) AS nearest_neighbors
    GROUP BY category_id;
  4. Anda dapat menggunakan pernyataan EXPLAIN untuk memeriksa apakah akselerasi indeks vektor untuk pencarian ANN aktif untuk pernyataan SQL Anda. Jika rencana eksekusi berisi Vector Search, fitur tersebut aktif.

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

    Contoh keluaran:

    +----+---------------------------+------+--------+--------+---------------------------------------------------------------------------------------+
    | 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   |                                                                                       |
    +----+---------------------------+------+--------+--------+---------------------------------------------------------------------------------------+

Deskripsi parameter

Parameter

Deskripsi

imci_enable_vector_search

Sakelar yang mengontrol apakah akan menggunakan indeks vektor untuk mempercepat pencarian ANN.

  • ON (default): Mengaktifkan fitur yang menggunakan indeks vektor untuk mempercepat pencarian ANN.

  • OFF: Menonaktifkan fitur yang menggunakan indeks vektor untuk mempercepat pencarian ANN.

imci_hnswpq_k_factor

Faktor ekspansi recall untuk pengambilan vektor ketika indeks vektor menggunakan algoritma FAISS_HNSW_PQ.

  • Rentang nilai: 1 hingga UINT32_MAX.

  • Nilai default adalah 1.

  • Unit: Pengali.

Catatan

Saat melakukan kueri vektor untuk mengambil K tetangga terdekat hampiran (ANN), pelaksana mengambil hasil K × imci_hnswpq_k_factor dari indeks HNSW PQ. Kemudian melakukan pengurutan tepat pada hasil tersebut menggunakan vektor asli dan mengembalikan K hasil teratas secara berurutan.

Lihat vektor

SELECT VECTOR_TO_STRING(v1) FROM t1;

Perhitungan jarak

Anda dapat menggunakan fungsi DISTANCE untuk menghitung kemiripan antara dua vektor dengan cara tertentu.

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

metrik parameter

Parameter

Deskripsi

COSINE

Kemiripan cosinus. Mengukur kemiripan arah antara dua vektor. Hasilnya adalah cosinus sudut antara kedua vektor. Nilai yang lebih kecil menunjukkan kemiripan yang lebih besar.

EUCLIDEAN

Jarak Euclidean. Mengukur jarak garis lurus antara dua vektor atau titik dalam ruang Euclidean. Nilai yang lebih kecil menunjukkan kemiripan yang lebih besar.

DOT

Hasil kali titik. Hasil perkalian komponen yang bersesuaian dari dua vektor lalu dijumlahkan. Nilai yang lebih kecil menunjukkan kemiripan yang lebih besar.

Contoh

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

Pencarian Tetangga Terdekat Tepat (KNN)

Pencarian tepat melakukan traversal semua data untuk menghitung jarak, yang menjamin tingkat recall 100%. Pencarian ini tidak bergantung pada indeks vektor dan cocok untuk skenario dengan set data kecil.

-- Temukan 10 catatan paling mirip dengan target
SELECT id, VECTOR_TO_STRING(v1)
FROM t1
ORDER BY DISTANCE(v1, STRING_TO_VECTOR('[...]'), 'COSINE')
LIMIT 10;

Contoh

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;

Kueri vektor dengan predikat

Anda dapat menggunakan kolom tambahan sebagai predikat untuk memfilter hasil kueri vektor. Contohnya:

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

Untuk kueri vektor yang mencakup predikat, Anda dapat menyesuaikan parameter tertentu untuk mengontrol urutan pengambilan indeks vektor dan pemfilteran predikat.

Strategi eksekusi

Pencarian vektor sering melibatkan pemfilteran berdasarkan properti lain. Pengoptimal secara cerdas memilih strategi eksekusi berdasarkan selektivitas kondisi filter:

  • Prefilter (prefilter): Ketika kondisi filter dapat secara signifikan mengurangi jumlah data (misalnya, ketika jumlah baris yang cocok kurang dari imci_vector_search_prefilter_rows, yang default-nya 10.000), sistem terlebih dahulu menerapkan filter predikat ke seluruh tabel untuk mengambil catatan yang cocok, mengurutkan catatan tersebut, lalu mengembalikan jumlah catatan yang ditentukan oleh klausa LIMIT.

  • Post-filtering (postfilter): Ketika kondisi filter memiliki selektivitas rendah (misalnya, jika tingkat kecocokan lebih tinggi dari imci_vector_search_filter_pct, yang default-nya 20%), sistem terlebih dahulu menggunakan indeks vektor untuk mengambil hasil lalu melakukan pemfilteran predikat pada hasil yang diambil. Jika jumlah hasil yang difilter kurang dari jumlah yang ditentukan oleh klausa LIMIT, prosedur ini diulang.

  • Inline filter: Jika pengoptimal tidak memilih strategi prefilter atau postfilter, sistem menggunakan strategi inline filter. Sistem terlebih dahulu memfilter seluruh tabel menggunakan predikat dan membangun filter bitmap dari RowID catatan yang cocok. Kemudian, sistem menggunakan indeks vektor untuk pengambilan. Selama proses pengambilan indeks vektor, sistem menggunakan filter bitmap untuk memastikan catatan paling mirip yang dikembalikan memenuhi kondisi predikat.

Optimasi eksekusi adaptif

Estimasi pengoptimal terhadap jumlah baris yang cocok dengan filter predikat dapat memiliki bias. Hal ini dapat menyebabkan pemilihan strategi eksekusi yang suboptimal. Mekanisme eksekusi adaptif secara dinamis mengganti strategi eksekusi selama runtime berdasarkan jumlah baris yang cocok sebenarnya.

Saat menjalankan kueri vektor dengan predikat menggunakan strategi inline filter, jika jumlah catatan yang cocok sebenarnya kurang dari imci_vector_search_prefilter_rows setelah predikat diterapkan ke seluruh tabel, sistem secara dinamis beralih ke strategi prefilter.

Optimasi partisi

Kueri vektor sering mencakup kondisi predikat seperti ID penyewa atau tag. Untuk kueri ini, Anda dapat menggunakan metode partisi LIST DEFAULT HASH. Anda dapat membuat partisi LIST terpisah untuk penyewa atau tag dengan volume data besar, dan partisi DEFAULT HASH untuk penyewa atau tag lainnya. Pengoptimal dapat mendeteksi kueri ini. Berdasarkan hasil pemangkasan partisi, pengoptimal memilih strategi postfilter untuk kueri vektor pada penyewa atau tag besar. Untuk penyewa lainnya, pengoptimal menggunakan strategi prefilter atau inline filter. Hal ini membantu memilih strategi eksekusi optimal untuk penyewa atau tag dengan ukuran berbeda.

Deskripsi parameter

Parameter

Deskripsi

imci_vector_search_filter_pct

Jika estimasi selektivitas filter predikat lebih besar dari atau sama dengan nilai ini, sistem memprioritaskan pengambilan indeks vektor.

  • Rentang nilai: 0 hingga 100.

  • Nilai default: 20.

  • Unit: %.

Nilai default 20 berarti jika estimasi selektivitas predikat 20% atau lebih tinggi, sistem terlebih dahulu mengambil hasil menggunakan indeks vektor lalu menerapkan filter predikat.

imci_enable_vector_search_inline_filter

Mengontrol apakah akan menggunakan strategi inline filter untuk kueri vektor yang mencakup predikat.

  • OFF (default): Dinonaktifkan.

  • ON: Diaktifkan.

imci_vector_search_prefilter_rows

Jika estimasi jumlah baris yang cocok dari filter predikat kurang dari nilai ini, sistem memprioritaskan metode pengambilan prefilter.

  • Rentang nilai: 0 hingga UINT64_MAX.

  • Nilai default: 10000.

  • Unit: Baris.

Nilai default 10.000 berarti jika estimasi jumlah baris yang cocok dari filter predikat kurang dari 10.000, sistem memprioritaskan metode prefilter. Sistem mengambil catatan yang cocok, mengurutkannya, lalu mengembalikan jumlah baris yang ditentukan oleh klausa LIMIT.

Pantau status indeks vektor

Pembuatan data indeks vektor dan pemajuan snapshot indeks penyimpanan kolom adalah tugas latar belakang terpisah. Dengan penulisan berkelanjutan, offset snapshot indeks vektor mungkin tertinggal dari snapshot data penyimpanan kolom. Sebelum menjalankan pencarian vektor, Anda harus memastikan indeks vektor tersedia. Status indeks vektor ditampilkan dalam tampilan sistem. Ini mencakup offset snapshot dan status indeks pada kolom vektor.

Offset snapshot indeks vektor

Kolom VECTOR_ROWS dalam tampilan INFORMATION_SCHEMA.IMCI_INDEX_STATS menunjukkan jumlah vektor dalam snapshot yang dimuat oleh indeks penyimpanan kolom. Nilai 0 berarti tidak ada indeks vektor yang tersedia pada indeks penyimpanan kolom saat ini. Hal ini dapat terjadi jika tabel tidak memiliki indeks vektor, atau jika indeks baru belum menghasilkan snapshot yang valid.

Anda juga dapat membandingkan nilai ini dengan kolom ROW_ID dalam tampilan INFORMATION_SCHEMA.IMCI_INDEXES untuk memperkirakan latensi pembuatan data indeks vektor. Indeks vektor tetap berfungsi meskipun ada latensi. Selama pencarian, sistem secara otomatis menangani data vektor apa pun yang belum ditulis ke indeks.

Status indeks vektor fisik

Tampilan sistem INFORMATION_SCHEMA.IMCI_VECTOR_INDEX_STATS menunjukkan status setiap indeks vektor fisik di dalam snapshot indeks vektor. Skema tabelnya adalah sebagai berikut:

Nama kolom

Deskripsi

SCHEMA_NAME

Nama DB.

TABLE_NAME

Nama tabel.

COLUMN_NAME

Nama kolom vektor.

VECTORS

Jumlah aktual vektor dalam indeks vektor. Nilai ini biasanya lebih kecil dari VECTOR_ROWS karena nilai NULL dan baris yang dihapus selama pembuatan dikecualikan.

MEMORY_USAGE

Penggunaan memori.

STORAGE_USAGE

Ukuran file persisten.

INDEX_TYPE

Jenis indeks. Saat ini, hanya HNSW yang didukung.

INDEX_PARAMETERS

Parameter pembuatan indeks vektor dalam format JSON.

Tampilan ini mengeluarkan status memori dan statistik untuk indeks vektor pada setiap kolom tempat indeks vektor diaktifkan. Informasi ini tidak secara langsung terkait dengan ketersediaan indeks vektor.

Catatan
  • Pencarian vektor hampiran tidak dapat dilakukan pada kolom apa pun yang tidak termasuk dalam hasil kueri tampilan ini.

  • Dalam tampilan ini, nilai 0 pada kolom VECTORS tidak berarti indeks vektor tidak tersedia. Hal ini biasanya terjadi setelah restart kluster ketika build bertahap atau kueri hampiran belum dijalankan. Data persisten untuk indeks vektor belum dimuat, sehingga jumlah vektor yang tepat sementara tidak tersedia. Untuk informasi snapshot vektor yang akurat, gunakan kolom VECTOR_ROWS dalam tampilan sistem INFORMATION_SCHEMA.IMCI_INDEX_STATS.

Contoh

  1. Untuk memastikan indeks vektor dapat dibangun secara normal dengan jumlah data kecil, Anda harus mengatur parameter imci_vector_index_dump_rows_threshold ke 1 di Konsol PolarDB.

  2. Buat tabel uji dan masukkan data:

    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. Periksa status snapshot indeks dan status indeks vektor:

    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. Masukkan lebih banyak data:

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

    Nilai kolom VECTORS dalam hasil kueri untuk INFORMATION_SCHEMA.IMCI_VECTOR_INDEX_STATS sekarang menjadi 3, meningkat sebesar 1. Hal ini menunjukkan bahwa tugas latar belakang telah menulis data yang dimasukkan ke indeks vektor:

    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. Restart node read-only indeks penyimpanan kolom dan periksa status indeks:

    Penting

    Me-restart node read-only indeks penyimpanan kolom membuat node saat ini tidak tersedia untuk waktu singkat.

    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)

    Hasil menunjukkan bahwa VECTORS bernilai 0 dalam tampilan sistem IMCI_VECTOR_INDEX_STATS, sedangkan offset snapshot indeks vektor adalah 3. Anda dapat menggunakan rencana eksekusi untuk memastikan indeks vektor tersedia. Kemudian, Anda dapat menjalankan kueri hampiran dan memeriksa status indeks vektor lagi:

    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)

    Setelah kueri hampiran dijalankan, indeks vektor dimuat ke memori, dan jumlah vektor dipulihkan menjadi 3.

FAQ

Mengapa indeks tidak digunakan dalam kueri vektor?

Ikuti langkah-langkah berikut untuk pemecahan masalah:

  1. Pastikan Anda telah menjalankan SET imci_enable_vector_search = ON; dan SET cost_threshold_for_imci = 0; dalam sesi.

  2. Anda dapat menggunakan EXPLAIN untuk memeriksa rencana eksekusi. Pastikan kolom Extra Info berisi operator Vector Search.

  3. Verifikasi bahwa pernyataan SQL memenuhi semua batasan yang tercantum dalam Pencarian Tetangga Terdekat Hampiran (ANN). Kesalahan umum termasuk tidak menggunakan LIMIT atau menggunakan arah pengurutan yang salah dalam ORDER BY.

  4. Verifikasi bahwa parameter metric dalam ekspresi DISTANCE(...) identik dengan parameter metric yang digunakan untuk membuat indeks vektor. Misalnya, jika indeks vektor dibangun menggunakan jarak COSINE, DISTANCE(...) juga harus menentukan COSINE.

Mengapa saya menerima kesalahan ERROR 9040 (HY000): Data size exceeds VECTOR max saat membuat vektor?

Dimensi vektor yang ditentukan melebihi batas maksimum 16.383. Anda dapat mengurangi nilai N dalam VECTOR(N).

Setelah saya me-restart node read-only indeks penyimpanan kolom, data pemantauan menunjukkan bahwa jumlah VECTORS adalah 0. Apakah indeks hilang?

Tidak, indeks tidak hilang. Ini adalah perilaku yang diharapkan. Data indeks dipersisten ke disk. Setelah restart, kueri pertama memicu data dimuat ke memori. Untuk informasi lebih lanjut, lihat alur diagnostik dalam Pantau status indeks vektor.

Parameter pq_m mengharuskan dimensi vektor harus habis dibagi pq_m. Apa yang harus saya lakukan jika dimensi adalah bilangan prima, seperti 1023?

Dalam kasus ini, Anda tidak dapat menggunakan indeks FAISS_HNSW_PQ. Anda memiliki opsi berikut:

  1. Pilih indeks lain. Anda dapat menggunakan HNSW atau FAISS_HNSW_FLAT. Indeks ini tidak memiliki batasan ini, tetapi mengonsumsi lebih banyak memori.

  2. Sesuaikan dimensi data. Pada lapisan aplikasi, Anda dapat menggunakan reduksi dimensi atau padding untuk menyesuaikan dimensi vektor ke nilai yang habis dibagi oleh pq_m, seperti 8, 16, atau 32.