Skip to content

向量类型

在数据库中,向量通常是一组数字,它们以特定的方式排列,以表示某种数据或特征。这些向量可以是一维数组、多维数组或具有更高维度的数据结构。MatrixOne 支持向量数据类型。

在 MatrixOne 中,向量被设计成一种数据类型,它类似于编程语言中的 Array 数组 (MatrixOne 目前还不支持数组类型),但是是一种较为特殊的数组类型。首先,它是一个一维数组类型,意味着它不能用来构建 Matrix 矩阵。另外目前仅支持 float32float64 类型的向量,分别称之为 vecf32vecf64 而不支持字符串类型和整型类型的数字。

创建一个向量列时,我们可以指定向量列的维度大小,如 vecf32(3),这个维度即向量的数组的长度大小,最大可支持到 65,535 维度。

如何在 SQL 中使用向量类型

使用向量的语法与常规建表、插入数据、查询数据相同。

创建向量列

你可以按照下面的 SQL 语句创建了两个向量列,一个是 Float32 类型,另一个是 Float64 类型,并且可以将两个向量列的维度都设置为 3。

目前向量类型不能作为主键或者唯一键。

create table t1(a int, b vecf32(3), c vecf64(3));

插入向量

MatrixOne 支持以两种格式插入向量。

文本格式

insert into t1 values(1, "[1,2,3]", "[4,5,6]");

二进制格式

如果你想使用 Python NumPy 数组,可以通过对数组进行十六进制编码,而不是将其转换为逗号分隔的文本格式,直接将该 NumPy 数组插入 MatrixOne。在插入维度较高的向量时,这种方式速度更快。

insert into t1 (a, b) values (2, cast(unhex("7e98b23e9e10383b2f41133f") as blob));
-- "7e98b23e9e10383b2f41133f" 表示 []float32{0.34881967, 0.0028086076, 0.5752134}的小端十六进制编码

查询向量

向量列同样可以以两种格式读取。

文本格式

mysql> select a, b from t1;
+------+---------------------------------------+
| a    | b                                     |
+------+---------------------------------------+
|    1 | [1, 2, 3]                             |
|    2 | [0.34881967, 0.0028086076, 0.5752134] |
+------+---------------------------------------+
2 rows in set (0.00 sec)

二进制格式

如果你需要将向量结果集直接读取到 NumPy 数组中,以最小的转换成本,二进制格式非常有用。

mysql> select hex(b) from t1;
+--------------------------+
| hex(b)                   |
+--------------------------+
| 0000803f0000004000004040 |
| 7e98b23e9e10383b2f41133f |
+--------------------------+
2 rows in set (0.00 sec)