向量搜索

本页面介绍如何在 Cloud SQL for MySQL 实例上实现向量搜索。Cloud SQL 可让您存储向量嵌入、创建向量索引,并结合其他存储的数据执行向量搜索

向量嵌入存储

您可以将向量嵌入存储在符合原子性、一致性、隔离性和持久性 (ACID) 属性的表中。与表中的其他关系型数据一样,您可以使用现有的事务语义来访问表中的向量嵌入。

如需在表行与向量表示法之间建立映射,您需要在表中创建一个列来存储向量嵌入。该列必须使用 Cloud SQL VECTOR 数据类型,并且必须指明嵌入所需的维度数量。向量嵌入列只能存储使用与您在定义该列时指定的维度完全相同的向量嵌入。

一个表只能有一个向量嵌入列。表中的行数没有限制。

为了将向量嵌入列与其他列区分开来,Cloud SQL 会向该列添加特殊的 COMMENTCONSTRAINT。输入验证需要限制条件,而向量嵌入列注解会显示为 COMMENT。您无法修改或删除注释或限制条件。

如果您的 Cloud SQL 实例有足够的可用存储空间和内存,则可以存储多个具有各自向量嵌入列的表。

向量嵌入列的数据复制方式与其他 MySQL InnoDB 列相同。

如需查看向量嵌入表、列和 DML 语句的局限和限制列表,请参阅限制

向量索引

您必须使用向量索引对向量嵌入执行 ANN 相似度搜索。Cloud SQL 使用可扩容最近邻 (ScANN) 算法来创建向量索引。

向量索引有以下要求���

  • 每个表只能创建一个向量索引。
  • 如果您的实例中有多个包含向量嵌入的表,您可以为每个表创建向量索引。
  • 如果您要创建向量索引,则无法向已编入索引的表的主键添加限制条件。

为了提高搜索质量,请仅在将大部分数据加载到基表中后再创建向量索引。如果基表中的嵌入少于 1000 个,则索引创建将失败。

在决定是否创建向量索引时,如果您只有少量行,请考虑是否可以改为执行 KNN 搜索。决定使用 KNN 还是 ANN 搜索还取决于向量嵌入的维度数。如果嵌入较多,则可能需要向量索引。

如需查看向量索引的局限和限制列表,请参阅限制。如需了解如何创建向量索引,请参阅创建和管理向量索引

向量索引更新

Cloud SQL 会实时更新向量索引。对基表执行数据操纵语言 (DML) 操作的任何事务还会将更改传播到关联的向量索引。向量索引的行为与表中的任何其他二级索引的行为相同。向量索引在事务上完全一致性并符合 ACID 标准。如果回滚事务,则向量索引中也会发生对应的回滚更改。

向量索引的复制

Cloud SQL 会将向量索引复制到所有读取副本,包括级联复制。当您从具有向量嵌入的主实例创建新的读取副本时,读取副本会从主实例继承向量嵌入设置。对于现有的读取副本,您必须为每个读取副本启用向量嵌入支持。

在对复制延迟时间的影响方面,向量索引的创建和维护操作方式与常规 MySQL 索引相同。

持久性、关停以及对维护的影响

向量索引的持久性与基表相同,并具有完整的 ACID 支持。向量索引始终与其基表数据同步,并且具有相同的可见性、隔离性和崩溃安全性。当实例关闭或接受维护时,向量索引不会受到影响。

索引维护

对基表执行大量 DML 操作后,您使用初始数据(在创建索引时)训练的向量索引可能无法反映新状态。这可能会影响搜索质量。

索引由两个部分组成。

  • 索引树。这是通过使用现有数据进行训练来构建的。它在索引的生命周期内保持不变。
  • 索引叶。索引叶包含所有数据行。索引叶永远不会不同步。

运行大量 DML 语句后,索引树的效率可能会降低,因为行会从一个叶移动到另一个叶。如需刷新索引树,您需要重建索引。

具有向量索引的表不支持的 DDL 操作

  • 需要复制算法的修改表操作。
  • 需要重建表的修改表操作。
  • 删除或更改主键。
  • 将表移至常规表空间。

向量搜索

Cloud SQL 提供向量距离函数,您可以使用这些函数对实例执行近似最近邻 (ANN) 和 K 最近邻 (KNN) 向量相似度搜索。当您运行查询时,系统会将查询向量与您数据集中的向量进行比较。距离函数使用余弦等相似度指标计算向量之间的距离。相隔距离最短的向量相似度最高,并会在搜索结果中返回。

当您执行 ANN 和 KNN 向量搜索时,Cloud SQL 会使用以下函数来计算向量搜索中向量之间的距离:

  • 余弦:计算两个向量之间夹角的余弦值。值越小,向量之间的相似度就越高。
  • 点积:计算角的余弦值与相应向量大小的乘积。
  • L2 平方距离:通过相加每个维度上的平方距离计算两个向量之间的欧几里得距离。

如果您需要精确的结果或想要添加选择性过滤,KNN 向量搜索是首选的搜索方法。KNN 搜索会对查询向量与数据集中的每个嵌入进行距离计算,以查找最近邻。Cloud SQL 中的 KNN 搜索可提供完美的召回率。KNN 搜索不使用向量索引,因此在处理较小的数据集时,它是一个不错的选择。

如需执行 KNN 搜索,您可以使用 vector_distance 函数,该函数接受两个向量作为输入:查询向量(您要搜索的内容)和数据集中的候选向量。它会计算这两个向量之间的距离。您可以在 SELECT 语句中使用 vector_distance。如需了解详情,请参阅搜索 K 最近邻 (KNN)

如果您发现 KNN 的表现不佳,可以稍后构建向量索引,并继续在应用中使用 approx_distance 进行 ANN 搜索。

如果您关心查询效率,则 ANN 向量搜索是首选的搜索类型。它通过计算查询向量与数据集中的部分向量之间的距离来加快相似度搜索的速度。为此,Cloud SQL 会将数据整理到集群或分区中,然后将搜索集中在与查询最接近的集群上。ANN 搜索需要向量索引。这些索引优先保证搜索速度,而不是完美召回率。在 Cloud SQL 中,TREE_SQ 索引类型用于 ANN 搜索。

如需执行 ANN 搜索,您可以将 approx_distance 函数与距离测量选项搭配使用。您可以在 ORDER BYSELECT 列表中使用 approx_distance,并且允许使用 LIMIT 子句来限制搜索结果。您还可以添加 WHERE 子句,������索结果进行���过滤。如需了解详情,请参阅搜索近似最近邻 (ANN)

在某些情况下,ANN 搜索会回退到 KNN 搜索。如需了解详情,请参阅检查 ANN 搜索的回退状态

要求

Cloud SQL 要求您先使用 cloudsql_vector 标志在实例上启用向量嵌入,然后才能添加向量嵌入。如需了解详情,请参阅在实例中启用和停用向量嵌入

限制

以下是具有向量嵌入列的表的限制:

  • 每个表只能有一个向量嵌入列。
  • 每个表只能有一个向量索引。
  • 一个向量嵌入最多只能有 16,000 个维度。
  • 向量嵌入列不能是生成的列。
  • 不支持对具有向量嵌入列的表进行表级分区。
  • 向量索引不支持使用 BITBINARYVARBINARYJSONBLOBTEXT 数据类型或空间数据的主键。复合主键也不能包含任何这些类型。
  • 如果有向量索引,则无法向基表的主键添加限制条件。
  • 如果表中存在向量索引,将无法执行某些 DDL 操作。如需了解详情,请参阅具有向量索引的表不支持的 DDL 操作

向量搜索查询存在以下限制:

  • approx_distance 函数只能在 ORDER BYSELECT 列表中使用。
  • 涉及基表的谓词可在 ORDER BYSELECT 列表中使用,在 WHERE 条件中与 approx_distance 表达式结合使用。对 approx_distance 向量函数求值后,再对 WHERE 条件谓词求值。

使用向量索引的最佳实践

本部分介绍使用向量索引的最佳实践。每种工作负载各不相同,您可能需要进行相应的调整。

  • 在进行重要的 DML 操作后,最好重建索引。
  • 通常,让 Cloud SQL 计算要使用的叶数量是可以接受的。如果您有需要指定叶数量的用例,建议每个叶至少有 100 个向量,以获得最佳召回率。

后续步骤