向量检索使用说明
背景
PolarDB MySQL版新增向量检索功能。该功能完全兼容MySQL 9.0原生向量检索语法,并可以通过列存索引IMCI的向量化执行和并行扫描加速向量检索。
版本要求
集群版本需为PolarDB MySQL版8.0.2.2.27及以上,您可以通过查询版本号来确认集群版本。
使用说明
类型定义
向量类型通过定义,例如可以通过如下方式在表中定义向量类型的列:
CREATE TABLE t1 (id INT PRIMARY KEY, c1 VECTOR(2));
其中N表示向量维度,目前支持的最大维度为16383,每一维都是单精度浮点数(4字节)。如果定义维度超过16383,建表语句将返回错误:
mysql> 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'
注意:
- 向量类型仅支持与向量类型进行等值比较,且不支持与其他任意类型进行比较。
- 向量类型的列无法作为主键、外键、唯一键、分区键。
类型转换
向量通过将向量的字符串表示转换为binary表示,例如可以通过如下方式转换:
mysql> SELECT STRING_TO_VECTOR('[1,2]');
+---------------------------+
| STRING_TO_VECTOR('[1,2]') |
+---------------------------+
| ?? @ |
+---------------------------+
1 row in set (0.00 sec)
mysql> SELECT HEX(STRING_TO_VECTOR('[1,2]'));
+--------------------------------+
| HEX(STRING_TO_VECTOR('[1,2]')) |
+--------------------------------+
| 0000803F00000040 |
+--------------------------------+
1 row in set (0.00 sec)
其中的输入为向量的字符串表示,输出为向量的binary表示。
注意:
- 向量的字符串表示必须为若干使用方括号包含并使用逗号相连的浮点数。
- 如果输入格式错误的字符串,表达式将返回错误,例如:
mysql> SELECT STRING_TO_VECTOR('[1,2');
ERROR 9041 (HY000): Data cannot be converted to a valid vector: '[1,2'
向量通过将向量的binary表示转换为向量的字符串表示,例如可以通过如下方式转换:
mysql> SELECT VECTOR_TO_STRING(0x0000803F00000040);
+--------------------------------------+
| VECTOR_TO_STRING(0x0000803F00000040) |
+--------------------------------------+
| [1.000000,2.000000] |
+--------------------------------------+
1 row in set (0.00 sec)
其中的输入为向量的binary表示,输出为向量的字符串表示。
注意:
- 向量的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的形式写入,例如可以通过如下方式向表中写入向量:
mysql> INSERT INTO t1 VALUES(1, 0x0000803F00000040);
Query OK, 1 row affected (0.01 sec)
mysql> SELECT VECTOR_TO_STRING(c1) FROM t1;
+----------------------+
| VECTOR_TO_STRING(c1) |
+----------------------+
| [1.000000,2.000000] |
+----------------------+
1 row in set (0.00 sec)
向量也可以通过以字符串的形式写入,例如可以通过如下方式向表中写入向量:
mysql> INSERT INTO t1 VALUES(1, STRING_TO_VECTOR('[1,2]'));
Query OK, 1 row affected (0.02 sec)
mysql> SELECT VECTOR_TO_STRING(c1) FROM t1;
+----------------------+
| VECTOR_TO_STRING(c1) |
+----------------------+
| [1.000000,2.000000] |
+----------------------+
1 row in set (0.00 sec)
向量检索
通过可以以指定方式计算两个向量之间的相似度,例如可以通过如下方式获取表中与向量余弦距离最近的向量:
mysql> 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)
mysql> 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)
其中需要3个输入,前两个输入为向量,最后一个输入为相似度计算方法,目前支持,和,相似度计算方法的参数为字符串类型,需以引号包含。




