对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs 菜单

估计Queryable Encryption存储影响

使用Queryable Encryption对字段进行加密并启用对加密字段的查询会增加集合所需的存储。在最终确定加密模式之前估计这些增加,因为更改增加需要重新创建集合。

您可以使用 mongodb-qe-size-estimate代理技能(可直接从公共存储库、mongodb 或 mongodb-atlas 插件获取)来计算集合的这些估计值。

有关Queryable Encryption的更深入信息,请参阅Queryable Encryption白皮书。

MongoDB通过生成标签 T 为每个可查询的加密字段建立索引,并将标签存储在为每个加密集合创建的元数据集合中。存储空间随着每个值生成的标签数量而增长。以下公式计算了一个值可以生成的最大标签数。

  • 不可查询(“未索引”)字段不生成标签 T=0。

  • 为相等查询建立索引的字段会生成一个标签T=1。

  • 为前缀或后缀查询建立索引的字段会生成一个初始标签,然后随着查询的最大和最小长度 T = 1 + (strMaxQueryLength - strMinQueryLength + 1) 之间的差值线性增长。

  • 为前缀和后缀查询建立索引的字段随着前缀和后缀查询的最大和最小长度之间的差值线性增长, T = 1 + (strMaxQueryLength_prefix - strMinQueryLength_prefix + 1) + (strMaxQueryLength_suffix - strMinQueryLength_suffix + 1)

  • 使用公式 T = 1 + (strMaxQueryLength - strMinQueryLength + 1) * (2 * strMaxLength + 2 - strMaxQueryLength - strMinQueryLength) / 2 时,为子字符串查询建立索引的字段生成的标签最多。

在集合上启用Queryable Encryption对磁盘存储和内存的影响可能比计算出的要小。这些公式可以防范最坏的情况。

重要

每次写入加密字段值还会为每个标签写入两个元数据文档,一份写入 ESC,一份写入 ECOC,因此写入吞吐量会随着标签计数而变化,就像存储一样。

对于前缀和后缀查询,只有最大和最小查询长度之间的差值才会影响标签增长。对于子字符串查询,所有参数都有贡献,而可搜索长度的贡献最大。下表比较了随着 strMaxQueryLength 的增加字符串字段生成的标签数量,假设 strMaxLength 为 50,strMinQueryLength 为 2。子字符串查询实施的最大 strMaxQueryLength 为 6,因此该表仅比较 2 到 6 的值,尽管前缀和后缀查询允许更高的值。

strMaxQueryLength
2
3
4
5
6

prefix or suffix

2

3

4

5

6

substring

50

98

145

191

236

由于这一增长,请避免对多个字段启用子字符串查询。仅当前缀和后缀查询无法满足您的需求并且集合包含的文档少于50百万时,才启用它们。

确保您拥有以下信息:

  • 集合中包含加密字段的文档数量。

  • 每个加密字段的明文值的平均字节长度。

  • 您计划加密的字段数量及其加密查询配置。

1

对于每个加密字段,计算 T,即单个值生成的标签数量的上限。为每个字段计算一个 T :为前缀和后缀查询建立索引的字段使用结合了两种查询类型的单个公式。

  1. 对于未索引字段,为 T = 0。

  2. 对于为相等查询建立索引的字段,T = 1。

  3. 对于为 prefix 或 suffix 查询建立索引的字段:

    T = 1 + (strMaxQueryLength - strMinQueryLength + 1)
  4. 对于同时为 prefix 和 suffix 查询建立索引的字段:

    T = 1 + (strMaxQueryLength_prefix - strMinQueryLength_prefix + 1) +
    (strMaxQueryLength_suffix - strMinQueryLength_suffix + 1)
  5. 对于为 substring 查询建立索引的字段:

    T = 1 + (strMaxQueryLength - strMinQueryLength + 1) *
    (2 * strMaxLength + 2 - strMaxQueryLength -
    strMinQueryLength) / 2

    示例,对于包含 strMinQueryLength 2、strMaxQueryLength 6 和 strMaxLength 50的字段:

    T = 1 + (6 - 2 + 1) * (2 * 50 + 2 - 6 - 2) / 2
    = 1 + 5 * 94 / 2
    = 236
2

使用上一步中的标签计数,计算单个文档对该字段所需的存储(以字节为单位)。使用以下公式,其中 v 是字段未加密值的平均字节长度。

对于未索引的字段,请使用:

document storage = 71 + ceil((v+6)/16) * 16

对于其他字段,请使用:

document storage = 1.2 * (255 * T + 122 + ceil((v + 6) / 16) * 16)

验证文档是否保持在大小限制之内。加密值及其元数据计入 16 MB BSON文档大小限制。

3

将每个字段的 T 值求和到 T_Total 中。然后,使用 N(包含加密字段的文档数量)计算以下内容(以字节为单位):

index storage = 1.2 * (67 * T_Total + 640)
total disk storage = N * (index storage + sum of the document storage per field)
memory = N * (52 * T_Total + 17)

除以 1,000,000,000,将磁盘总存储转换为GB 。除以 1,073,741,824,将内存转换为 GiB。

4

将估计的磁盘和内存影响与当前集合大小相加,然后将总数与部署中的可用存储和内存进行比较。

有关加密字段的查询配置选项的详细信息,请参阅字段参考。

要配置加密字段和查询类型,请参阅创建加密模式。

要学习;了解每个配置选项如何影响安全性和性能,请参阅配置加密字段以实现最佳搜索和存储。