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 | 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 |
Tipe vektor
Definisi tipe
Anda dapat menggunakan pernyataan CREATE TABLE atau ALTER TABLE dengan tipe VECTOR(N) untuk mendefinisikan kolom vektor.
Nmerepresentasikan 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));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]'.CatatanJika 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 heksadesimal0x3F800000, disimpan dalam database dengan nilai binerHEXsebesar0000803F. 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.
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, sepertiHNSW,FAISS_HNSW_FLAT, atauFAISS_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_valueatauparameter_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 |
| Diimplementasikan berdasarkan VSAG. Algoritma ini memberikan presisi tinggi tetapi mengonsumsi banyak memori. |
| Diimplementasikan berdasarkan FAISS. Algoritma ini memberikan presisi tinggi tetapi mengonsumsi banyak memori. |
| 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 |
|
|
| Ukuran kemiripan vektor. |
Catatan Hanya nilai huruf kapital yang didukung. |
|
|
|
| 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 |
| - |
| 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 |
| - |
| Jumlah subruang untuk kuantisasi produk (PQ). | Bilangan bulat positif yang merupakan pembagi dari dimensi vektor. Dimensi vektor harus habis dibagi oleh | 1 |
| - |
| 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.
|
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.
|
Ubah indeks vektor
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.
CatatanVersi 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 BYdanLIMIT.Ekspresi pertama dalam klausa
ORDER BYharus berupaDISTANCE(...).Arah pengurutan untuk
ORDER BY DISTANCE(...)harusASC.Bidang dalam ekspresi
DISTANCE(...)harus memiliki indeks vektor aktif.Parameter
metricdalam ekspresiDISTANCE(...)harus sama dengan parametermetricyang digunakan saat Anda membuat indeks vektor. Misalnya, jika indeks vektor dibangun dengan jarakCOSINE,DISTANCE(...)juga harus menentukanCOSINE.Jika kueri mencakup
JOIN, rencana eksekusi harus menggunakan struktur Right Deep Join Tree. Bidang yang dirujuk dalam ekspresiDISTANCE(...)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
Aktifkan akselerasi indeks vektor.
Jalankan perintah berikut dalam sesi untuk mengizinkan pengoptimal menggunakan indeks vektor.SET imci_enable_vector_search = ON;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;PentingSET 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.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 BYsebagai 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;Anda dapat menggunakan pernyataan
EXPLAINuntuk memeriksa apakah akselerasi indeks vektor untuk pencarian ANN aktif untuk pernyataan SQL Anda. Jika rencana eksekusi berisiVector 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.
|
imci_hnswpq_k_factor | Faktor ekspansi recall untuk pengambilan vektor ketika indeks vektor menggunakan algoritma
Catatan Saat melakukan kueri vektor untuk mengambil K tetangga terdekat hampiran (ANN), pelaksana mengambil hasil |
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 |
| Kemiripan cosinus. Mengukur kemiripan arah antara dua vektor. Hasilnya adalah cosinus sudut antara kedua vektor. Nilai yang lebih kecil menunjukkan kemiripan yang lebih besar. |
| Jarak Euclidean. Mengukur jarak garis lurus antara dua vektor atau titik dalam ruang Euclidean. Nilai yang lebih kecil menunjukkan kemiripan yang lebih besar. |
| 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
bitmapdari RowID catatan yang cocok. Kemudian, sistem menggunakan indeks vektor untuk pengambilan. Selama proses pengambilan indeks vektor, sistem menggunakan filterbitmapuntuk 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.
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.
|
imci_vector_search_prefilter_rows | Jika estimasi jumlah baris yang cocok dari filter predikat kurang dari nilai ini, sistem memprioritaskan metode pengambilan prefilter.
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 |
| Nama DB. |
| Nama tabel. |
| Nama kolom vektor. |
| Jumlah aktual vektor dalam indeks vektor. Nilai ini biasanya lebih kecil dari VECTOR_ROWS karena nilai NULL dan baris yang dihapus selama pembuatan dikecualikan. |
| Penggunaan memori. |
| Ukuran file persisten. |
| Jenis indeks. Saat ini, hanya HNSW yang didukung. |
| 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.
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
VECTORStidak 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 kolomVECTOR_ROWSdalam tampilan sistemINFORMATION_SCHEMA.IMCI_INDEX_STATS.
Contoh
Untuk memastikan indeks vektor dapat dibangun secara normal dengan jumlah data kecil, Anda harus mengatur parameter
imci_vector_index_dump_rows_thresholdke 1 di Konsol PolarDB.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]'));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)Masukkan lebih banyak data:
INSERT INTO t1 VALUES(3, STRING_TO_VECTOR("[8.8,8.88,8.888,8.8888]"));Nilai kolom
VECTORSdalam hasil kueri untukINFORMATION_SCHEMA.IMCI_VECTOR_INDEX_STATSsekarang 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)Restart node read-only indeks penyimpanan kolom dan periksa status indeks:
PentingMe-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
VECTORSbernilai 0 dalam tampilan sistemIMCI_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.