云原生向量数据库Milvus(二)-数据与索引的处理流程、索引类型及Schema(上)

简介: 本文将介绍 Milvus 系统中数据写入、索引构建、数据查询的具体处理流程,同时,还会介绍Milvus支持的索引类型;另外,还将讲述如何定义字段和集合Schema。

数据与索引的处理流程


数据写入

用户可以为每个 collection 指定 shard 数量,每个 shard 对应一个虚拟通道 (vchannel)。如下图所示,在日志代理( log broker)内,每个 vchannel 被分配了一个对应的物理通道(pchannel)。Proxy 基于主键哈希决定输入的增删请求进入哪个 shard。

由于没有复杂事务,DML 的检查与确认工作被提前至 Proxy。对于所有的增删请求,Proxy 会先通过请求位于 root coord 的 TSO 中心授时模块获取时间戳。这个时间戳决定了数据最终可见和相互覆盖的顺序。除了分配时间戳,Proxy 也为每行数据分配全局唯一的 Primary key。

Primary key 以及 entity 所处的 segmentID 均从 data coord 批量获取,批量有助于提升系统的吞吐,降低 data coord 的负载。

网络异常,图片无法展示
|


除增删类操作之外,数据定义类操作也会写⼊⽇志序列(Log sequence)。由于数据定义类操作出现的频率很低,系统只为其分配一路 channel。

网络异常,图片无法展示
|


虚拟通道 (vchannel)在底层日志代理节点中维护。不同虚拟通道 (vchannel)可以被调度到不同的物理节点,但每个 channel 在物理上不再进一步拆分,因此单个 vchannel 不会跨多个物理节点。

当 collection 写入出现瓶颈时,通常需要关注两个问题:一是 log broker 节点负载是否过高,是否需要扩容;二是 shard 是否足够多,保证每个 log broker 的负载足够均衡。

网络异常,图片无法展示
|

]

上图总结了日志序列的写⼊过程中涉及的四个组件:Proxy、log broker、data node 和对象存储。 整体共四部分工作:DML 请求的检查与确认、日志序列的发布订阅、流式日志到日志快照的转换、日志快照的持久化存储。

在 Milvus 2.0 中,对这四部分工作进行了解耦,做到同类型节点之间的对等。面向不同的⼊库负载,特别是大规模⾼波动的流式负载,各环节的系统组件可以做到独立的弹性伸缩。

索引构建

构建索引的任务由 index node 执⾏。为了避免数据更新导致的索引频繁重复构建,Milvus 将 collection 分成了更⼩的粒度,即 segment,每个 segment 对应自己的独立的索引。

网络异常,图片无法展示
|


Milvus 可以对每个向量列、标量列和主键列构建索引。索引构建任务的输⼊与输出都是对象存储。Index node 拉取 segment 中需要构建索引的日志快照,在内存中进⾏数据与元信息的反序列化,构建索引。索引构建完成后,将索引结构序列化并写回对象存储。

对向量构建索引的过程属于计算密集、访存密集的负载类型,主要操作是向量运算与矩阵运算。由于被索引的数据维度过高,难以通过传统的树形结构进行高效索引。目前较为成熟的技术是基于聚类或图来表示高维稠密向量的近邻关系。无论哪种索引类型,都涉及到大规模向量数据的多次迭代计算,如寻找聚类、图遍历的收敛状态。

与传统的索引操作相比,向量计算需要充分利⽤ SIMD 加速。目前,Milvus 内置的引擎支持 SSE、AVX2、AVX512 等 SIMD 指令。向量索引任务具备突发性、高资源消耗等特点,其弹性能力对于成本格外重要。未来 Milvus 会继续探索异构计算和 serverless 架构,持续优化索引构建的成本。


同时,Milvus 支持标量过滤和主键查询功能。为了实现高效率的标量查询,Milvus 构建了 Bloom filter index、hash index、tree index 和倒排索引( inverted index)。未来 Milvus 会逐渐完善索引类型,提供 bitmap index、rough index 等更多外部索引能力。

数据查询

数据查询指在一个指定 collection 中查找与目标向量最近邻的 k 个向量或满足距离范围的全部向量的过程。结果返回满足条件的向量及其对应的 primary key 和 field。

网络异常,图片无法展示
|


一个 collection 中的数据被分为多个 segment,query node 以 segment 为粒度加载索引。查询请求会广播到全部的 query node,所有 query node 并发执行查询。每个 query node 各自对本地的 segment 进行剪枝并搜索符合条件的数据,同时将各 segment 结果进行聚合返回。

上述过程中 query node 并不感知其他 query node 的存在,每个 query node 只需要完成两件任务:首先是响应 query coord 的调度,加载/卸载 segment;其次是根据本地的 segment 响应查询请求。Proxy 负责将每个 query node 返回的数据进行全局聚合返回给客户端。

网络异常,图片无法展示
|


Query node 中的 segment 只存在两种状态,分别对应增量数据(growing)和历史数据(sealed)。对于 growing segment,query node 通过订阅 vchannel 获取数据的近期更新。

当 data coord 已经 flush 完该 segment 的所有数据,会通知 query coord 进行 handoff 操作,将增量数据转换为历史数据。

Sealed segment 的索引由 index node 构建完成后会被 query node 自动加载。对于 sealed segment,query coord 会综合考虑内存使用、CPU 开销、segment 数目等因素,尽可能均匀分配给所有的 query node。


Milvus 支持哪些索引类型及距离计算公式?


创建索引是一个组织数据的过程,是向量数据库实现快速查询百万、十亿、甚至万亿级数据集所依赖的一个巨大组成部分。在查询或检索数据前,必须先指定索引类型及距离计算公式。如未指定索引类型,Milvus 将默认执行暴力搜索。

相似性搜索引擎的工作原理是将输入的对象与数据库中的对象进行比较,找出与输入最相似的对象。索引是有效组织数据的过程,极大地加速了对大型数据集的查询,在相似性搜索的实现中起着重要作用。对一个大规模向量数据集创建索引后,查询可以被路由到最有可能包含与输入查询相似的向量的集群或数据子集。在实践中,这意味着要牺牲一定程度的准确性来加快对真正的大规模向量数据集的查询。

为提高查询性能,你可以为每个向量字段指定一种索引类型。目前,一个向量字段仅支持一种索引类型。切换索引类型时,Milvus 自动删除之前的索引。


注意:

默认设定下,Milvus 不会对插入的数据少于 1024 行的 segment 创建索引。如修改此项参数,需修改 milvus.yaml 中的 rootCoord.minSegmentSizeToEnableIndex配置项。

索引创建机制

create_index 方法被调用时,Milvus 会同步为这个字段的现有数据创建索引。Segment 是 Milvus 中储存数据的最小单位。在建立索引时,Milvus 为每个 Segment 单独创建索引文件。


索引类型

Milvus 目前支持的向量索引类型大都属于 ANNS(Approximate Nearest Neighbors Search,近似最近邻搜索)。

ANNS 的核心思想是不再局限于只返回最精确的结果项,而是仅搜索可能是近邻的数据项,即以牺牲可接受范围内的精度的方式提高检索效率。

根据实现方式,ANNS 向量索引可分为五大类:

  • 基于树的索引
  • 基于图的索引
  • 基于哈希的索引
  • 基于量化的索引
  • 基于量化和图的索引

Milvus 支持的索引类型如下,我们可以根据应用场景选择具体的索引:

  • FLAT:适用于需要 100% 召回率数据规模相对较小(百万级)的向量相似性搜索应用。
  • IVF_FLAT:基于量化的索引,适用于追求查询准确性和查询速度之间理想平衡的场景(高速查询、要求高召回率)
  • IVF_SQ8:基于量化的索引,适用于磁盘或内存、显存资源有限的场景(高速查询、磁盘和内存资源有限、接受召回率的小幅妥协)
  • IVF_PQ:基于量化的索引,适用于追求高查询速度、低准确性的场景(超高速查询、磁盘和内存资源有限、接受召回率的实质性妥协)
  • HNSW:基于图的索引,适用于追求高查询效率的场景(高速查询、要求尽可能高的召回率、内存资源大的情景)
  • ANNOY:基于树的索引,适用于追求高召回率的场景(低维向量空间)
  • IVF_HNSW:基于量化和图的索引,高速查询、需要尽可能高的召回率、内存资源大的情景
  • RHNSW_FLAT:基于量化和图的索引,高速查询、需要尽可能高的召回率、内存资源大的情景
  • RHNSW_SQ:基于量化和图的索引,高速查询、磁盘和内存资源有限、接受召回率的小幅妥协
  • RHNSW_PQ:基于量化和图的索引,超高速查询、磁盘和内存资源有限、接受召回率的实质性妥协
相关实践学习
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
9月前
|
存储 关系型数据库 MySQL
MySQL数据库索引的数据结构?
MySQL中默认使用B+tree索引,它是一种多路平衡搜索树,具有树高较低、检索速度快的特点。所有数据存储在叶子节点,非叶子节点仅作索引,且叶子节点形成双向链表,便于区间查询。
240 4
|
12月前
|
存储 XML JSON
Activiti 7 核心数据库表概览及流程生命周期中的作用
Activiti 7 工作流引擎通过约25张核心数据库表实现流程定义、运行时状态、历史记录与身份数据的存储。表名以ACT_开头,后跟标识用途的字母组合(如RE表示Repository静态信息,RU表示Runtime动态数据)。流程启动时在运行时表登记数据,任务执行中更新关联信息,结束时清理运行时记录并完善历史记录。各表分工明确且逻辑紧密关联,确保高效运行与完整留痕的平衡。掌握这些表的作用和关联有助于深入理解Activiti底层原理及进行高级应用开发。
939 0
|
10月前
|
存储 算法 关系型数据库
数据库主键与索引详解
本文介绍了主键与索引的核心特性及其区别。主键具有唯一标识、数量限制、存储类型和自动排序等特点,用于确保数据完整性和提升查询效率;而索引通过特殊数据结构(如B+树、哈希)优化查询速度,适用于不同场景。文章分析了主键与索引的优劣、适用场景及工作原理,并对比两者在唯一性、数量限制、功能定位等方面的差异,为数据库设计提供指导。
|
存储 缓存 数据库
数据库索引采用B+树不采用B树的原因?
● B+树更便于遍历:由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引。 ● B+树的磁盘读写代价更低:B+树在内部节点上不包含数据信息,因此在内存页中能够存放更多的key。 数据存放的更加紧密,具有更好的空间局部性。因此访问叶子节点上关联的数据也具有更好的缓存命中率。 ● B+树的查询效率更加稳定:由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条
|
SQL 关系型数据库 OLAP
云原生数据仓库AnalyticDB PostgreSQL同一个SQL可以实现向量索引、全文索引GIN、普通索引BTREE混合查询,简化业务实现逻辑、提升查询性能
本文档介绍了如何在AnalyticDB for PostgreSQL中创建表、向量索引及混合检索的实现步骤。主要内容包括:创建`articles`表并设置向量存储格式,创建ANN向量索引,为表增加`username`和`time`列,建立BTREE索引和GIN全文检索索引,并展示了查询结果。参考文档提供了详细的SQL语句和配置说明。
522 2
|
人工智能 关系型数据库 分布式数据库
阿里云PolarDB重磅发布云原生与Data+AI新特性,打造智能时代数据引擎
阿里云PolarDB重磅发布云原生与Data+AI新特性,打造智能时代数据引擎
843 0
|
存储 缓存 数据库
数据库索引采用B+树不采用B树的原因?
B+树优化了数据存储和查询效率,数据仅存于叶子节点,便于区间查询和遍历,磁盘读写成本低,查询效率稳定,特别适合数据库索引及范围查询。
187 6
|
存储 缓存 数据库
数据库索引采用B+树不采用B树的原因
B+树相较于B树,在数据存储、磁盘读写、查询效率及范围查询方面更具优势。数据仅存于叶子节点,便于高效遍历和区间查询;内部节点不含数据,提高缓存命中率;查询路径固定,效率稳定;特别适合数据库索引使用。
234 1
|
数据库 索引
数据库索引
数据库索引 1、索引:建立在表一列或多列的辅助对象,目的是加快访问表的数据。 2、索引的优点: (1)、创建唯一性索引,可以确保数据的唯一性; (2)、大大加快数据检索速度; (3)、加速表与表之间的连接; (4)、在查询过程中,使用优化隐藏器,提高系统性能。 3、索引的缺点: (1)、创建和维护索引需要耗费时间,随数据量增加而增加; (2)、索引占用物理空间; (3)、对表的数据进行增删改时,索引需要动态维护,降低了数据的维护速度。
271 2

热门文章

最新文章