跳到主要内容
版本:v2.4.x

管理 Partition

本指南将指导您如何创建和管理 Collection 中的 Partition。

Partition 概述​

在 Milvus 中,一个 Partition 代表一个 Collection 的子 Partition。此功能允许将 Collection 的物理存储划分为多个部分,通过将关注点缩小到较小的数据子集而不是整个 Collection,有助于提高查询性能。

创建 Collection 时,至少会自动创建一个名为 _default 的默认 Partition。在一个 Collection 中最多可以创建 1,024 个 Partition。

说明

注释

Milvus 引入了一项名为 Partition Key 的功能,利用底层 Partition,根据特定字段的散列值来存储实体。该功能有助于实现多租户,提高搜索性能。有关详细信息,请阅读 使用 Partition Key。

如果在 Collection 中开启了 Partition Key 功能,Milvus 会负责管理所有 Partition,从而减轻你的责任。

准备工作​

下面的代码片段对现有代码进行了重新利用,以建立与 Milvus 的连接,并在快速设置模式下创建一个 Collection,表示创建时已加载该 Collection。

对于准备工作,使用 MilvusClient 连接到 Milvus,并使用 create_collection() 以快速设置模式创建 Collection。

Python
from pymilvus import MilvusClient, DataType

# 1. Set up a Milvus client
client = MilvusClient(
uri="http://localhost:19530"
)

# 2. Create a collection
client.create_collection(
collection_name="quick_setup",
dimension=5,
)
说明

注释

在上述代码片段中,Collection 的索引已与 Collection 一起创建,表明创建时已加载 Collection。

列出 Partition​

一旦 Collection 就绪,就可以列出其 Partition。

要列出 Partition,请使用 list_partitions().

Python
# 3. List partitions
res = client.list_partitions(collection_name="quick_setup")
print(res)

# Output
#
# ["_default"]

上述代码片段的输出包括指定 Collection 内 Partition 的名称。

说明

注释

如果在 Collection 中设置了字段作为 Partition Key,Milvus 会随 Collection 创建至少 64 个 Partition。在列出 Partition 时,结果可能与上述代码片段的输出不同。

详情请参阅 使用 Partition Key。

创建 Partition​

您可以向 Collection 添加更多 Partition。一个 Collection 最多可以有 4,096 个 Partition。

要创建 Partition,请使用 create_partition().

Python
# 4. Create more partitions
client.create_partition(
collection_name="quick_setup",
partition_name="partitionA"
)

client.create_partition(
collection_name="quick_setup",
partition_name="partitionB"
)

res = client.list_partitions(collection_name="quick_setup")
print(res)

# Output
#
# ["_default", "partitionA", "partitionB"]

上面的代码片段在一个 Collection 中创建了一个 Partition,并列出了该 Collection 的 Partition。

说明

注释

如果你在一个 Collection 中设置了一个字段作为 Partition Key,Milvus 会负责管理 Collection 中的 Partition。因此,在尝试创建 Partition 时可能会遇到提示错误。

有关详细信息,请参阅 使用 Partition Key。

检查特定 Partition​

您还可以检查特定 Partition 是否存在。

要检查特定 Partition,请使用 has_partition().

Python
# 5. Check whether a partition exists
res = client.has_partition(
collection_name="quick_setup",
partition_name="partitionA"
)
print(res)

# Output
#
# True

res = client.has_partition(
collection_name="quick_setup",
partition_name="partitionC"
)
print(res)

# Output
#
# False

上面的代码片段会检查 Collection 是否有名为 partitionA 和 partitionC 的 Partition。

加载和释放 Partition​

您可以加载和释放特定 Partition,使其对搜索和查询可用或不可用。

获取加载状态​

要检查 Collection 及其 Partition 的加载状态,请使用 get_load_state().

Python
# Release the collection
client.release_collection(collection_name="quick_setup")

# Check the load status
res = client.get_load_state(collection_name="quick_setup")
print(res)

# Output
#
# {
# "state": "<LoadState: Loaded>"
# }

res = client.get_load_state(
collection_name="quick_setup",
partition_name="partitionA"
)

print(res)

# Output
#
# {
# "state": "<LoadState: Loaded>"
# }

res = client.get_load_state(
collection_name="quick_setup",
partition_name="partitionB"
)

print(res)

# Output
#
# {
# "state": "<LoadState: NotLoad>"
# }

可能的加载状态如下

  • 已加载

如果一个 Collection 中至少有一个 Partition 已加载,则标记为 Loaded。

  • 未加载

如果一个 Collection 的任何 Partition 都未加载,则将其标记为 NotLoad。

  • 加载中

如果某个 Collection 中至少有一个 Partition 处于加载过程中,则该 Collection 会被标记为 Loading。

加载 Partition​

要加载 Collection 的所有 Partition,只需调用 load_collection().要加载 Collection 的特定 Partition,可使用 load_partitions().

Python
client.load_partitions(
collection_name="quick_setup",
partition_names=["partitionA"]
)

res = client.get_load_state(collection_name="quick_setup")
print(res)

# Output
#
# {
# "state": "<LoadState: Loaded>"
# }

要一次加载多个 Partition,请按以下步骤操作:

Python
client.load_partitions(
collection_name="quick_setup",
partition_names=["partitionA", "partitionB"]
)

res = client.get_load_state(
collection_name="quick_setup",
partition_name="partitionA"
)

# Output
#
# {
# "state": "<LoadState: Loaded>"
# }

res = client.get_load_state(
collection_name="quick_setup",
partition_name="partitionB"
)

# Output
#
# {
# "state": "<LoadState: Loaded>"
# }

要加载一个或多个 Partition 中的指定字段,请执行以下操作:

Python
client.load_partitions(
collection_name="quick_setup",
partition_names=["partitionA"],
load_fields=["id", "vector"],
skip_load_dynamic_field=True
)

请注意,只有 load_fields 中列出的字段才能用作搜索和查询中的筛选条件和输出字段。列表中应始终包含主键。不加载的字段名将不能用于筛选或输出。

可以使用 skip_load_dynamic_field=True 跳过加载动态字段。Milvus 将动态字段视为单个字段,因此动态字段中的所有键将一起被包含或排除。

释放 Partition​

要释放 Collection 的所有 Partition,只需调用 release_collection().要释放 Collection 的特定 Partition,可使用 release_partitions().

Python
# 7. Release a partition
client.release_partitions(
collection_name="quick_setup",
partition_names=["partitionA"]
)

res = client.get_load_state(
collection_name="quick_setup",
partition_name="partitionA"
)

print(res)

# Output
#
# {
# "state": "<LoadState: NotLoad>"
# }

要一次释放多个 Partition,请按以下步骤操作:

Python
client.release_partitions(
collection_name="quick_setup",
partition_names=["_default", "partitionA", "partitionB"]
)

res = client.get_load_state(
collection_name="quick_setup",
)

# Output
#
# {
# "state": "<LoadState: NotLoad>"
# }

丢弃 Partition​

释放 Partition 后,如果不再需要,就可以将其丢弃。

要丢弃 Partition,请使用 drop_partition().

Python
# 8. Drop a partition
client.drop_partition(
collection_name="quick_setup",
partition_name="partitionB"
)

res = client.list_partitions(collection_name="quick_setup")
print(res)

# Output
#
# ["_default", "partitionA"]
说明

注意事项

在丢弃 Partition 之前,需要将其从内存中释放。

常见问题​

  • Partition 中可以存储多少数据?

建议在一个 Partition 中存储少于 1B 的数据。

  • 最多可以创建多少个 Partition?

默认情况下,Milvus 最多允许创建 1,024 个 Partition。您可以通过配置 rootCoord.maxPartitionNum 来调整 Partition 的最大数量。有关详情,请参阅 系统配置。

  • 如何区分 Partition 和 Partition Key?

Partition 是物理存储单元,而 Partition Key 是逻辑概念,可根据指定列自动将数据分配到特定 Partition。

例如,在 Milvus 中,如果你的 Collection 的 Partition Key 定义为 color 字段,系统会根据每个实体的 color 字段的散列值自动将数据分配到 Partition。这一自动化流程免除了用户在插入或搜索数据时手动指定 Partition 的责任。

另一方面,在手动创建 Partition 时,需要根据 Partition Key 的标准为每个 Partition 分配数据。如果你有一个带有 color 字段的 Collection,你会手动将 color 值为 red 的实体分配到 partition A,将 color 值为 blue 的实体分配到 partition B。这种手动管理需要更多的精力。

总之,Partition 和 Partition Key 都是用来优化数据计算和提高查询效率的。必须认识到,启用 Partition Key 意味着放弃对 Partition 数据插入和加载的人工管理控制,因为这些过程完全由 Milvus 自动处理。