暂无图片
暂无图片
6
暂无图片
暂无图片
暂无图片

MySQL9.0 向量特性

原创 CuiHulong 2025-06-24
482

向量通俗理解为一个既有大小又有方向的量,就像用带箭头的线段表示一样,箭头指向代表方向,线段长度代表大小,通过这些表示数据的特征。向量的数据是多个数值组成的列表,比如[1.2, 3.4, 5.6]数字序列,更像于简单的JSON格式。

与关系型数据库的区别,关系型数据库是一种以表格形式存储数据的数据库系统,适用于处理结构化数据。而向量数据库则专为处理向量数据而设计,具有高维索引、相似性查询和向量聚合等特殊功能。关系型数据库通常不具备这些功能。

image.png
如图所示,向量映射到多维空间,可以对向量的语义相似性进行细致的分析,从而显著提高搜索和数据分类的准确性,而不是使用基于精确匹配或预定义标准查询数据库的传统方法。

向量数据库的应用场景

向量数据库适用于多种应用场景,以下是其中几个典型示例:
1.推荐系统:向量数据库可以用于构建高效的推荐系统。它支持向量的相似性查询和聚合操作,可以快速找出最相关的物品或服务,并根据用户的历史行为生成个性化推荐。
2.搜索引擎:搜索引擎可以利用向量数据库来提高搜索质量和效率。通过将网页内容表示为向量,可以建立索引并快速查找与查询相关的网页。
3.社交媒体分析:向量数据库可用于社交媒体分析,包括情感分析、主题建模和社区发现等。它支持向量的相似性查询和聚合操作,可以快速识别和提取社交媒体数据中的模式和趋势。
4.生物信息学:向量数据库在生物信息学领域有广泛应用,如基因序列分析和蛋白质相互作用预测。通过将基因序列和蛋白质表示为向量,可以高效地进行模式识别、聚类和预测。
5.图像和视频分析:向量数据库可以用于图像和视频分析,包括图像检索、物体识别和场景分类等。通过将图像和视频表示为向量,可以建立索引并快速查找相似的图像或视频。

MySQL中的向量

MySQL9.0开始支持向量VECTOR,定义为新的数据类型,由一系列条目(4字节浮点值)组成,这些条目可以表示为二进制字符串值或列表格式的字符串。向量列用最大长度或条目数(在括号中)声明;默认值为2048,最大值为16383=16kb (innodb_page_size大小)。

键值定义

虽然向量定义为单一字段类型,但因多维度特性,无法像其他类型,作为索引引用。不能作为:

  • 主键;
  • 外键;
  • 唯一密钥;
  • 分区键;
  • 其他索引;
  • 直方图源;

按照这个设计就不能用于索引组织表,只能有自己单独的算法定位数据。

函数的支持

可以结合内置的一些函数配合使用:

  • 与MySQL字符串函数BIT_LENGTH()、CHAR_LENGTHs()、HEX()、LENGTH()和TO_BASE64()可以一起使用。其他字符串函数不接受VECTOR类型作为参数。
  • 可以用作任何加密函数AES_ENCRYPT()、COMPRESS()、MD5()、SHA1()和SHA2()的参数。

不能用于函数和运算符

  • 数字函数和运算符;
  • 时间函数;
  • 全文搜索功能;
  • XML函数;
  • 位函数,如位AND和OR;
  • JSON函数;

SQL函数处理

向量列目前提供了4个函数 = 3个公用函数 + 1个OCI用户 配合使用。

向量函数 说明
DISTANCE 根据指定方法计算两个向量之间的距离(不包含在商业版或社区版中,仅适用于OCI上的HeatWave MySQL用户)。
STRING_TO_VECTOR 获取由一致字符串表示的VECTOR列的二进制值
VECTOR_DIM() 获取向量的长度(即它包含的条目数)
VECTOR_TO_STRING() 获取向量列的字符串表示形式,给定其值为二进制字符串

转换实例:

#STRING_TO_VECTOR mysql> SELECT STRING_TO_VECTOR('[2, 3, 5, 7]'); +------------------------------------------------------+ | TO_VECTOR('[2, 3, 5, 7]') | +------------------------------------------------------+ | 0x00000040000040400000A0400000E040 | +------------------------------------------------------+ 1 row in set (0.00 sec) #VECTOR_TO_STRING mysql> SELECT VECTOR_TO_STRING(0x00000040000040400000A0400000E040); +------------------------------------------------------+ | VECTOR_TO_STRING(0x00000040000040400000A0400000E040) | +------------------------------------------------------+ | [2.00000e+00,3.00000e+00,5.00000e+00,7.00000e+00] | +------------------------------------------------------+ 1 row in set (0.00 sec)

无法解析为向量值的此函数的参数会引发错误。此函数输出的最大大小为262128(16*16383)字节。

DIM支持二级制和实际数据的计算

mysql> SELECT VECTOR_DIM(0x0040004000800080); +--------------------------------+ | VECTOR_DIM(0x0040004000800080) | +--------------------------------+ | 2 | +--------------------------------+ 1 row in set (0.000 sec) mysql> SELECT VECTOR_DIM(TO_VECTOR('[2, 3, 5]') ); +-------------------------------------+ | VECTOR_DIM(TO_VECTOR('[2, 3, 5]') ) | +-------------------------------------+ | 3 | +-------------------------------------+ 1 row in set (0.001 sec)

向量类型的字段,不分引擎。

可以创建InnoDB,MyISAM引擎,其他引擎也都可以。

mysql> CREATE TABLE `vector_t02` ( `id` int DEFAULT NULL, `s_v_01` vector(390) DEFAULT NULL, `s_v_02` vector(390) DEFAULT NULL ) ENGINE=InnoDB; mysql>CREATE TABLE `vector_t02` ( `id` int DEFAULT NULL, `s_v_01` vector(390) DEFAULT NULL, `s_v_02` vector(390) DEFAULT NULL ) ENGINE=MyISAM;

向量数据基础操作

向量长度是收到限制的。

mysql> CREATE TABLE `vector_t03` ( `id` int DEFAULT NULL, `s_v_01` vector(2) DEFAULT NULL, `s_v_02` vector(2) DEFAULT NULL ) ENGINE=InnoDB; #增删改查,需要通过向量函数进行操作。 mysql> SELECT * FROM vector_t03; +------+--------------------+--------------------+ | id | s_v_01 | s_v_02 | +------+--------------------+--------------------+ | 1 | 0x0000A04000004040 | 0x0000404000008040 | +------+--------------------+--------------------+ 1 row in set (0.000 sec) mysql> INSERT INTO vector_t03 VALUES(1,string_to_vector('[1,2]'),string_to_vector('[3,4]')); mysql> UPDATE vector_t03 SET s_v_01=string_to_vector('[5,3]') WHERE s_v_01=string_to_vector('[1,3]'); mysql> DELETE FROM vector_t03 WHERE s_v_01=string_to_vector('[5,3]'); #操作设置大小也会提示错误 mysql> INSERT INTO vector_t03 VALUES(5,string_to_vector('[1,2,3,4]'),string_to_vector('[4,5,6]')); ERROR 1406 (22001): Data too long for column 's_v_01' at row 1

总结

目前MySQL开源提供的向量功能非常基础。同时向量类型在企业和开源版本中也没有完全融入。比如:在NDB表目前不支持VECTOR列,MLE组件或JavaScript也不支持VECTOR类型。
按照向量数据结构,应该更适合于列式场景中发挥更多功能,如HeatWave引擎。

备注:
消息级别加密 (Message-Level Encryption,MLE) 是一种安全技术,用于在传输期间保护消息的机密性和完整性。它涉及使用加密算法来争用消息的内容,以便只有目标收件人(具有解密密钥)才能读取消息。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论