使用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 |
|---|---|---|---|---|---|
| 2 | 3 | 4 | 5 | 6 |
| 50 | 98 | 145 | 191 | 236 |
由于这一增长,请避免对多个字段启用子字符串查询。仅当前缀和后缀查询无法满足您的需求并且集合包含的文档少于50百万时,才启用它们。
开始之前
确保您拥有以下信息:
集合中包含加密字段的文档数量。
每个加密字段的明文值的平均字节长度。
您计划加密的字段数量及其加密查询配置。
步骤
计算每个字段和查询类型的最坏情况标签计数。
对于每个加密字段,计算 T,即单个值生成的标签数量的上限。为每个字段计算一个 T :为前缀和后缀查询建立索引的字段使用结合了两种查询类型的单个公式。
对于未索引字段,为
T = 0。对于为相等查询建立索引的字段,
T = 1。对于为
prefix或suffix查询建立索引的字段:T = 1 + (strMaxQueryLength - strMinQueryLength + 1) 对于同时为
prefix和suffix查询建立索引的字段:T = 1 + (strMaxQueryLength_prefix - strMinQueryLength_prefix + 1) + (strMaxQueryLength_suffix - strMinQueryLength_suffix + 1) 对于为
substring查询建立索引的字段:T = 1 + (strMaxQueryLength - strMinQueryLength + 1) * (2 * strMaxLength + 2 - strMaxQueryLength - strMinQueryLength) / 2 示例,对于包含
strMinQueryLength2、strMaxQueryLength6 和strMaxLength50的字段:T = 1 + (6 - 2 + 1) * (2 * 50 + 2 - 6 - 2) / 2 = 1 + 5 * 94 / 2 = 236
计算每个字段的文档存储。
使用上一步中的标签计数,计算单个文档对该字段所需的存储(以字节为单位)。使用以下公式,其中 v 是字段未加密值的平均字节长度。
对于未索引的字段,请使用:
document storage = 71 + ceil((v+6)/16) * 16
对于其他字段,请使用:
document storage = 1.2 * (255 * T + 122 + ceil((v + 6) / 16) * 16)
验证文档是否保持在大小限制之内。加密值及其元数据计入 16 MB BSON文档大小限制。