向量类型
在数据库中,向量通常是一组数字,它们以特定的方式排列,以表示某种数据或特征。这些向量可以是一维数组、多维数组或具有更高维度的数据结构。MatrixOne 支持向量数据类型。
在 MatrixOne 中,向量被设计成一种数据类型,它类似于编程语言中的 Array 数组 (MatrixOne 目前还不支持数组类型),但是是一种较为特殊的数组类型。首先,它是一个一维数组类型,意味着它不能用来构建 Matrix 矩阵。另外目前仅支持 float32
及 float64
类型的向量,分别称之为 vecf32
与 vecf64
而不支持字符串类型和整型类型的数字。
创建一个向量列时,我们可以指定向量列的维度大小,如 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)