向量检索使用说明

更新时间:2025-02-27 10:14:25

PolarDB MySQL新增向量检索功能。该功能完全兼容MySQL 9.0原生向量检索语法,并可以通过列存索引(IMCI)的向量化执行和并行扫描,加速向量检索。

版本要求

PolarDB MySQL8.0版本且修订版本为8.0.2.2.27或以上,您可以通过内核版本说明确认集群的修订版本。

使用说明

类型定义

向量类型通过VECTOR(N)定义。例如可以通过如下方式在表t1中定义向量类型的列c1

说明

以下示例表示在表t1中定义列c1的向量维度VECTOR=2。

CREATE TABLE t1 (id INT PRIMARY KEY, c1 VECTOR(2));
说明
  • 其中N表示向量维度,目前支持的最大维度为16383,每一维都是单精度浮点数(4字节)。如果定义维度超过16383,建表语句将返回错误:

    CREATE TABLE t1 (id INT PRIMARY KEY, c1 VECTOR(16384));
    ERROR 9040 (HY000): Data size (65536 Bytes, 16384 dimensions) exceeds VECTOR max (65532 Bytes, 16383 dimensions) for column: 'c1'
  • 向量类型仅支持与向量类型进行等值比较,且不支持与其他任意类型进行比较。

  • 向量类型的列无法作为主键、外键、唯一键、分区键。

类型转换

  • 向量通过STRING_TO_VECTOR将向量的字符串表示转换为Binary表示。

  • 向量通过VECTOR_TO_STRING将向量的Binary表示转换为向量的字符串表示。

将向量转换为Binary
向量Binary转换为向量字符串
SELECT STRING_TO_VECTOR('[1,2]');
+---------------------------+
| STRING_TO_VECTOR('[1,2]') |
+---------------------------+
|   ??   @                   |
+---------------------------+
1 row in set (0.00 sec)
SELECT HEX(STRING_TO_VECTOR('[1,2]'));
+--------------------------------+
| HEX(STRING_TO_VECTOR('[1,2]')) |
+--------------------------------+
| 0000803F00000040               |
+--------------------------------+
1 row in set (0.00 sec)

其中STRING_TO_VECTOR的输入为向量的字符串表示,输出为向量的Binary表示。

说明
  • 输入格式要求:需为使用方括号包含并用英文逗号分隔的若干浮点数组成的字符串。

  • 如果输入格式错误的字符串,表达式将返回错误:

    SELECT STRING_TO_VECTOR('[1,2');
    ERROR 9041 (HY000): Data cannot be converted to a valid vector: '[1,2'
SELECT VECTOR_TO_STRING(0x0000803F00000040);
+--------------------------------------+
| VECTOR_TO_STRING(0x0000803F00000040) |
+--------------------------------------+
| [1.000000,2.000000]                  |
+--------------------------------------+
1 row in set (0.00 sec)

其中VECTOR_TO_STRING的输入为向量的Binary表示,输出为向量的字符串表示。

说明
  • 输入格式说明:每4个字节为向量中某一维的浮点数的Binary表示。如浮点数1Binary表示为0x3F800000,对应上述示例中输入的前4个字节0x0000803F。

  • 如果输入格式错误的Binary表示,表达式将返回错误,例如:

    mysql> SELECT VECTOR_TO_STRING(0x0000803F000000);
    ERROR 9041 (HY000): Data cannot be converted to a valid vector: ''

向量写入

向量以Binary写入
向量以字符串写入

向量可以直接以Binary的形式写入。

INSERT INTO t1 VALUES(1, 0x0000803F00000040);

查询t1表中向量[1,2]

SELECT VECTOR_TO_STRING(c1) FROM t1;

向量通过STRING_TO_VECTOR以字符串的形式写入。

INSERT INTO t1 VALUES(1, STRING_TO_VECTOR('[1,2]'));

查询t1表中向量[1,2]

SELECT VECTOR_TO_STRING(c1) FROM t1;

向量检索

通过DISTANCE可以以指定方式计算两个向量之间的相似度。可通过如下方式获取t1表中与向量[1.2,2.3]余弦距离最近的向量:

SELECT id, VECTOR_TO_STRING(c1) FROM t1;
+----+----------------------+
| id | VECTOR_TO_STRING(c1) |
+----+----------------------+
|  1 | [1.000000,2.000000]  |
|  2 | [2.000000,3.000000]  |
|  3 | [3.000000,4.000000]  |
+----+----------------------+
3 rows in set (0.00 sec)
SELECT id, VECTOR_TO_STRING(c1) FROM t1 ORDER BY DISTANCE(c1, STRING_TO_VECTOR('[1.2,2.3]'), 'COSINE') LIMIT 1;
+----+----------------------+
| id | VECTOR_TO_STRING(c1) |
+----+----------------------+
|  1 | [1.000000,2.000000]  |
+----+----------------------+
1 row in set (0.00 sec)

其中DISTANCE需要3个输入,前两个输入为向量,最后一个输入为相似度计算方法,目前支持COSINEDOTEUCLIDEAN,相似度计算方法的参数为字符串类型,需以引号包含。

参数说明

参数

说明

参数

说明

COSINE

余弦相似度。

说明

衡量两个向量之间的方向相似性,结果为两个向量夹角的余弦值。

DOT

点积。

说明

两个向量对应分量相乘后再相加的结果。

EUCLIDEAN

欧式距离。

说明

衡量两个向量或点在欧几里得空间中的直线距离。

  • 本页导读 (1)
  • 版本要求
  • 使用说明
  • 类型定义
  • 类型转换
  • 向量写入
  • 向量检索
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等