IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    admin发表于 2025-05-25 09:13:59
    love 0

    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相关功能。

    参考链接

    • [1] MySQL 9.0 Reference Manual :: 13.3.5 The VECTOR Type
    • [2] MySQL 9.1 Reference Manual :: 14.21 Vector Functions
    • [3] 在 Oracle 云上免费测试数据库


沪ICP备19023445号-2号
友情链接