PolarDB MySQL版新增向量检索功能。该功能完全兼容MySQL 9.0原生向量检索语法,并可以通过列存索引(IMCI)的向量化执行和并行扫描,加速向量检索。
版本要求
PolarDB MySQL版8.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表示转换为向量的字符串表示。
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表示。如浮点数1的Binary表示为0x3F800000,对应上述示例中输入的前4个字节0x0000803F。
如果输入格式错误的Binary表示,表达式将返回错误,例如:
mysql> SELECT VECTOR_TO_STRING(0x0000803F000000); ERROR 9041 (HY000): Data cannot be converted to a valid vector: ''
向量写入
向量可以直接以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个输入,前两个输入为向量,最后一个输入为相似度计算方法,目前支持COSINE
,DOT
和EUCLIDEAN
,相似度计算方法的参数为字符串类型,需以引号包含。
参数说明
参数 | 说明 |
参数 | 说明 |
| 余弦相似度。 衡量两个向量之间的方向相似性,结果为两个向量夹角的余弦值。 |
| 点积。 两个向量对应分量相乘后再相加的结果。 |
| 欧式距离。 衡量两个向量或点在欧几里得空间中的直线距离。 |
- 本页导读 (1)
- 版本要求
- 使用说明
- 类型定义
- 类型转换
- 向量写入
- 向量检索