使用Oracle云上的MySQL 9.x作为向量存储

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

Your email address will not be published. Required fields are marked *