All Products
Search
Document Center

AnalyticDB:Pencarian vektor

Last Updated:Jun 26, 2026

AnalyticDB for MySQL mendukung pencarian vektor pada data tidak terstruktur menggunakan SQL standar. Simpan vektor fitur bersama kolom terstruktur, buat indeks approximate nearest neighbor (ANN), dan jalankan kueri kemiripan dengan L2_DISTANCE—tanpa memerlukan database vektor terpisah.

Prasyarat

Kluster Anda harus menjalankan kernel versi 3.1.4.0 atau lebih baru.

  • Fitur indeks vektor lebih stabil pada kluster yang menjalankan kernel versi 3.1.5.16, 3.1.6.8, 3.1.8.6, atau versi yang lebih baru.

  • Jika kluster Anda tidak menjalankan salah satu versi stabil tersebut, atur parameter CSTORE_PROJECT_PUSH_DOWN dan CSTORE_PPD_TOP_N_ENABLE ke false sebelum menggunakan fitur indeks vektor.

Sebelum memulai, pastikan Anda memiliki:

  • Kluster AnalyticDB for MySQL yang menjalankan V3.1.4.0 atau lebih baru

  • (Direkomendasikan) Versi minor 3.1.5.16, 3.1.6.8, 3.1.8.6, atau lebih baru untuk performa pencarian vektor yang optimal

Jika kluster Anda tidak menggunakan salah satu versi minor yang direkomendasikan, atur parameter CSTORE_PROJECT_PUSH_DOWN dan CSTORE_PPD_TOP_N_ENABLE ke false sebelum menggunakan pencarian vektor. Untuk memeriksa versi minor Anda, lihat Bagaimana cara mengecek versi kluster AnalyticDB for MySQL? Untuk melakukan peningkatan versi minor, hubungi dukungan teknis.

Cara kerja

image.png

Gunakan model AI untuk mengekstraksi fitur dari data tidak terstruktur Anda dan mengencode-nya sebagai array float berdimensi tetap (vektor fitur). Simpan vektor tersebut di AnalyticDB for MySQL bersama kolom terstruktur Anda.

Saat melakukan kueri, masukkan vektor kueri ke L2_DISTANCE. Database menghitung jarak Euclidean kuadrat antara vektor kueri dan setiap vektor yang tersimpan, lalu mengembalikan hasil yang paling mirip. Jarak yang lebih kecil menunjukkan kemiripan yang lebih tinggi.

Alur kerja lengkapnya:

  1. Buat tabel dengan satu atau beberapa kolom vektor (ARRAY<FLOAT>, ARRAY<BYTE>, atau ARRAY<SMALLINT>).

  2. Tambahkan indeks ANN pada setiap kolom vektor—saat pembuatan tabel atau dengan ALTER TABLE.

  3. Masukkan baris data, termasuk nilai vektornya.

  4. Lakukan kueri dengan L2_DISTANCE dan ORDER BY … LIMIT (k-nearest neighbor) atau tambahkan ambang batas jarak di klausa WHERE (radius nearest neighbor).

Konsep utama

IstilahDefinisi
Vektor fiturArray numerik berdimensi tetap yang merepresentasikan suatu entitas dalam ruang vektor. Jarak antara dua vektor mengukur tingkat kemiripannya. Misalnya, array float berdimensi 512 dapat merepresentasikan wajah manusia.
Indeks vektor (ANN INDEX)Indeks khusus yang mempercepat pencarian approximate nearest-neighbor pada kolom vektor.
k-nearest neighbor (KNN)Mengembalikan *k* baris yang vektornya paling dekat dengan vektor kueri. Gunakan ORDER BY l2_distance(...) LIMIT k.
Radius nearest neighbor (RNN)Mengembalikan semua baris yang vektornya berada dalam jarak tertentu dari vektor kueri. Gunakan WHERE l2_distance(...) < threshold.
L2_DISTANCEFungsi SQL untuk jarak Euclidean kuadrat: (x₁−y₁)² + (x₂−y₂)² + … + (xₙ−yₙ)². Nilai yang lebih rendah berarti vektor lebih mirip.

Buat tabel dengan indeks vektor

Definisikan kolom vektor sebagai ARRAY<FLOAT>, ARRAY<BYTE>, atau ARRAY<SMALLINT> dan tambahkan deklarasi ANN INDEX dalam pernyataan CREATE TABLE yang sama.

Sintaks:

ANN INDEX [index_name] (column_name) [algorithm=HNSW_PQ] [distancemeasure=SquaredL2]
ParameterDeskripsi
index_nameNama indeks. Lihat Batasan penamaan.
column_nameNama kolom vektor. Tipe data yang didukung: ARRAY<FLOAT>, ARRAY<BYTE>, ARRAY<SMALLINT>. Lihat Batasan penamaan.
algorithmAtur ke HNSW_PQ (hierarchical navigable small world with product quantization). Ini adalah satu-satunya algoritma yang didukung.
distancemeasureAtur ke SquaredL2 (jarak Euclidean kuadrat). Ini adalah satu-satunya metrik jarak yang didukung. Rumus: (x₁−y₁)² + (x₂−y₂)² + … + (xₙ−yₙ)².

Contoh:

Pernyataan berikut membuat tabel bernama vector dengan dua kolom vektor terindeks: float_feature (ARRAY<FLOAT>, berdimensi 4) dan short_feature (ARRAY<SMALLINT>, berdimensi 4).

CREATE TABLE vector (
  xid bigint not null,
  cid bigint not null,
  uid varchar not null,
  vid varchar not null,
  wid varchar not null,
  float_feature array < float >(4),
  short_feature array < smallint >(4),
  ANN INDEX idx_short_feature(short_feature),
  ANN INDEX idx_float_feature(float_feature),
  PRIMARY KEY (xid, cid, vid)
) DISTRIBUTED BY HASH(xid);

Tambahkan indeks vektor ke tabel yang sudah ada

Gunakan ALTER TABLE untuk menambahkan indeks ANN ke kolom pada tabel yang sudah ada.

Sintaks:

CREATE TABLE vector (
  xid BIGINT not null,
  cid BIGINT not null,
  uid VARCHAR not null,
  vid VARCHAR not null,
  wid VARCHAR not null,
  float_feature array < FLOAT >(4),
  short_feature array < SMALLINT >(4),
  PRIMARY KEY (xid, cid, vid)
) DISTRIBUTED BY HASH(xid);

Contoh:

Diberikan tabel berikut (dibuat tanpa indeks ANN):

CREATE TABLE vector (
  xid BIGINT not null,
  cid BIGINT not null,
  uid VARCHAR not null,
  vid VARCHAR not null,
  wid VARCHAR not null,
  float_feature array < FLOAT >(4),
  short_feature array < SMALLINT >(4),
  PRIMARY KEY (xid, cid, vid)
) DISTRIBUTED BY HASH(xid);

Tambahkan indeks pada kedua kolom vektor:

ALTER TABLE vector ADD ANN INDEX idx_float_feature(float_feature);
ALTER TABLE vector ADD ANN INDEX idx_short_feature(short_feature);
ALTER TABLE table_name ADD ANN INDEX [index_name] (column_name) [algorithm=HNSW_PQ ] [distancemeasure=SquaredL2]

Kueri data vektor

Semua contoh di bawah menggunakan L2_DISTANCE untuk mengurutkan baris berdasarkan kemiripan terhadap vektor kueri.

Masukkan data sampel:

INSERT into vector (xid,cid,uid,vid,wid,short_feature,float_feature) VALUES (1,2,'A','B','C','[1,1,1,1]','[1.2,1.5,2,3.0]');
INSERT into vector (xid,cid,uid,vid,wid,short_feature,float_feature) VALUES (2,1,'e','v','f','[2,2,2,2]','[1.5,1.15,2.2,2.7]');
INSERT into vector (xid,cid,uid,vid,wid,short_feature,float_feature) VALUES (0,6,'d','f','g','[3,3,3,3]','[0.2,1.6,5,3.7]');
INSERT into vector (xid,cid,uid,vid,wid,short_feature,float_feature) VALUES (5,4,'j','b','h','[4,4,4,4]','[1.0,4.15,6,2.9]');
INSERT into vector (xid,cid,uid,vid,wid,short_feature,float_feature) VALUES (8,5,'Sj','Hb','Dh','[5,5,5,5]','[1.3,4.5,6.9,5.2]');
INSERT into vector (xid,cid,uid,vid,wid,short_feature,float_feature) VALUES (5,4,'x','g','h','[3,4,4,4]','[1.0,4.15,6,2.9]');
INSERT into vector (xid,cid,uid,vid,wid,short_feature,float_feature) VALUES (5,4,'j','r','k','[6,6,4,4]','[1.0,4.15,6,2.9]');
INSERT into vector (xid,cid,uid,vid,wid,short_feature,float_feature) VALUES (5,4,'s','i','q','[2,2,4,4]','[1.0,4.15,6,2.9]');

KNN: kembalikan k tetangga terdekat teratas

Kembalikan 3 baris dalam short_feature yang paling dekat dengan [1,1,1,1]:

SELECT xid, l2_distance(short_feature, '[1,1,1,1]') as dis FROM vector ORDER BY 2 LIMIT 3;

Hasil:

+-------+--------------+
| xid   |   dis        |
+-------+--------------+
| 1     |   0.0        |
+-------+--------------+
| 2     |   4.0        |
+-------+--------------+
| 0     |   16.0       |
+-------+--------------+

KNN dengan filter terstruktur

Kembalikan 4 baris terdekat di mana xid = 5 dan cid = 4:

SELECT uid, l2_distance(short_feature, '[1,1,1,1]') as dis FROM vector WHERE xid = 5 AND cid = 4 ORDER BY 2 LIMIT 4;

Hasil:

+-------+--------------+
| uid   |   dis        |
+-------+--------------+
| s     |   20.0       |
+-------+--------------+
| x     |   31.0       |
+-------+--------------+
| j     |   36.0       |
+-------+--------------+
| j     |   68.0       |
+-------+--------------+

RNN: filter berdasarkan ambang batas jarak

Kembalikan hingga 3 baris di mana jarak kurang dari 50,0 dan xid = 5:

SELECT uid, l2_distance(short_feature, '[1,1,1,1]') as dis FROM vector WHERE l2_distance(short_feature, '[1,1,1,1]') < 50.0 AND xid = 5 ORDER BY 2 LIMIT 3;

Hasil:

+-------+---------------+
| uid   |   dis         |
+-------+---------------+
| s     |   20.0        |
+-------+---------------+
| x     |   31.0        |
+-------+---------------+
| j     |   36.0        |
+-------+---------------+

Kasus penggunaan

  • Pencarian berbasis gambar — Encode gambar produk atau pemandangan sebagai vektor dan temukan hasil yang secara visual mirip.

  • Pengenalan wajah — Simpan penyematan wajah dan cocokkan wajah kueri terhadap database.

  • Pencocokan voiceprint — Bandingkan penyematan suara pembicara untuk otentikasi atau identifikasi.

  • Pencarian teks — Encode kalimat dengan model bahasa dan ambil cuplikan yang secara semantik mirip.

Performa

AnalyticDB for MySQL menggunakan arsitektur massively parallel processing (MPP) untuk memberikan pencarian vektor dalam tingkat milidetik. Hasil benchmark menggunakan vektor wajah berdimensi 512:

SkenarioVolume dataQPSWaktu responsRecall
Recall tinggi, beban moderat10 miliar entri10050 ms99%
Throughput tinggi200 juta entri1.0001 dtk99%

Database mendukung tulisan real-time dengan konkurensi tinggi. Data langsung dapat dikueri setelah dimasukkan.