向量通俗理解为一个既有大小又有方向的量,就像用带箭头的线段表示一样,箭头指向代表方向,线段长度代表大小,通过这些表示数据的特征。向量的数据是多个数值组成的列表,比如[1.2, 3.4, 5.6]数字序列,更像于简单的JSON格式。
与关系型数据库的区别,关系型数据库是一种以表格形式存储数据的数据库系统,适用于处理结构化数据。而向量数据库则专为处理向量数据而设计,具有高维索引、相似性查询和向量聚合等特殊功能。关系型数据库通常不具备这些功能。

如图所示,向量映射到多维空间,可以对向量的语义相似性进行细致的分析,从而显著提高搜索和数据分类的准确性,而不是使用基于精确匹配或预定义标准查询数据库的传统方法。
向量数据库的应用场景
向量数据库适用于多种应用场景,以下是其中几个典型示例:
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) 是一种安全技术,用于在传输期间保护消息的机密性和完整性。它涉及使用加密算法来争用消息的内容,以便只有目标收件人(具有解密密钥)才能读取消息。




