MySQL的向量处理现状
向量数据库或者说向量处理是,个人认为,最为重要数据库AI
能力。目前,各个数据库都在围绕着向量数据库构建更为丰富的LLM/AI
相关功能。而MySQL 9
最为重要的特性之一就是新增了向量处理能力。当前的版本主要包括了:(a) 向量数据类型;(b) 简单的向量处理函数。其中部分向量处理函数放在了MySQL
的企业版或云版本中。
因为当前MySQL 9
系列的版本均为创新版(并不是稳定版),所以相关功能还会不断的迭代和发展。期待未来做出更多丰富功能:(a) 新增向量相似性搜索功能;(b) 并将完整的向量处理能力放到社区版中。后续依旧会持续关注这部分的产品能力。
本文测试环境为Oracle Cloud
,你可以参考在 Oracle 云上免费测试数据库[3]文中创建一个免费的MySQL实例进行测试。
MySQL中的向量数据类型
向量数据存储
在MySQL 9
中新增了数据类型vector
用来存储向量数据[1],简单的使用方式如下:
create table vector_t01 (
id int,
s_v_01 vector(390),
s_v_02 vector(390)
);
这里表示s_v_01、s_v_02均为390维的向量,每个维度在MySQL中使用4 bytes
的单精度浮点类型存储。
写入向量数据
为了测试使用方便,这里使用string_to_vector
对向量进行转换并进行存储:
insert into vector_t01 values (1,string_to_vector('[1,2,3]'),string_to_vector('[4,5,6]'));
查询向量数据
使用 VECTOR_TO_STRING
使用 SELECT
直接查询向量数据的话,则返回的是二进制形式,可以使用函数VECTOR_TO_STRING
做一次转换:
select id,VECTOR_TO_STRING(s_v_01),VECTOR_TO_STRING(s_v_02) FROM vector_t01;
+------+---------------------------------------+---------------------------------------+
| id | VECTOR_TO_STRING(s_v_01) | VECTOR_TO_STRING(s_v_02) |
+------+---------------------------------------+---------------------------------------+
| 1 | [1.00000e+00,2.00000e+00,3.00000e+00] | [4.00000e+00,5.00000e+00,6.00000e+00] |
+------+---------------------------------------+---------------------------------------+
如果不使用VECTOR_TO_STRING
则返回的是底层的二进制存储内容:
select id,s_v_01,s_v_02 FROM vector_t01;
+------+--------------+--------------+
| id | s_v_01 | s_v_02 |
+------+--------------+--------------+
| 1 | �? @ @@ | �@ �@ �@ |
+------+--------------+--------------+
十六进制查询
如果使用十六进制展示,则有:
select id,hex(s_v_01),hex(s_v_02) FROM vector_t01;
+------+--------------------------+--------------------------+
| id | hex(s_v_01) | hex(s_v_02) |
+------+--------------------------+--------------------------+
| 1 | 0000803F0000004000004040 | 000080400000A0400000C040 |
+------+--------------------------+--------------------------+
这里的0000803F0000004000004040
一共是3个bytes
,每个byte
表示一个分量,例如:0000803F
表示第一个分量,即为单精度浮点型的1.0
(感兴趣的可以尝试做个转换,这里不再详述)。
计算向量距离
目前,MySQL 支持最为常见的“距离”的计算,具体包括:点积(默认)、欧式距离、余弦距离的计算:
-- s_v_01: (1,2,3)
-- s_v_01: (4,5,6)
SELECT
DISTANCE(s_v_01,s_v_02,"DOT") as dis_dot,
DISTANCE(s_v_01,s_v_02,"COSINE") as dis_cos,
DISTANCE(s_v_01,s_v_02,"EUCLIDEAN") as dis_ecu
FROM vector_t01;
+---------+----------------------+-------------------+
| dis_dot | dis_cos | dis_ecu |
+---------+----------------------+-------------------+
| 32 | 0.025368213653564453 | 5.196152210235596 |
+---------+----------------------+-------------------+
需要注意的是,目前该距离计算函数(DISTANCE
[2])仅在Oracle Cloud或MySQL企业版本中提供。后续还将持续关注MySQL所提供的向量产品能力、以及其他GenAI
相关功能。
Leave a Reply