基于插槽的查询执行引擎性能提升
MongoDB 7.0 版本中的基于槽的查询执行引擎(Slot-Based Query Execution Engine)是对之前版本的进一步优化和扩展。这项技术通过将查询操作分解成一系列的“槽”(slot),每个槽负责处理查询的一个特定部分,从而允许更细粒度的并行处理。这样的设计使得数据库在处理复杂查询时能够更加高效,尤其是在处理包含 $group 或 $lookup 阶段的聚合管道查询时,新引擎能够提供更好的性能表现。
分片键分析
MongoDB 7.0 版本中引入的 analyzeShardKey 命令和 db.collection.analyzeShardKey() 方法是用于分析集合的分片键性能的重要工具。这些工具基于采样查询的结果来评估分片键的合理性,从而帮助设计更优的 Schema 以及分片键,使得数据在分片集群中的分布更加合理,提高查询效率。
db.adminCommand({
analyzeShardKey: <string>,
key: <shardKey>,
keyCharacteristics: <bool>,
readWriteDistribution: <bool>,
sampleRate: <double>,
sampleSize: <int>
})
analyzeShardKey 字段:指定要分析的集合的命名空间。
key 字段:定义要分析的分片键。这可以是未分片集合或分片集合的候选分片键,也可以是分片集合的当前分片键。
keyCharacteristics 字段:决定是否计算分片键的特征指标,如关联基数、频率和单调性。
readWriteDistribution 字段:决定是否计算读写分布的指标。
sampleRate 字段:定义计算分片键特征指标时,集合中要进行采样的文档所占的比例。
sampleSize 字段:定义计算分片键特征相关指标时要采样的文档数量。
可查询加密(Queryable Encryption)
MongoDB 7.0 版本中引入的可查询加密(Queryable Encryption)是一项重要的安全特性,允许用户在客户端加密敏感数据字段,并将这些字段以完全随机化的加密数据形式存储在数据库服务器端。同时,还支持对加密数据运行表达性查询。以下是可查询加密的一些关键点:
数据加密与查询:可查询加密允许客户端加密敏感数据字段,并在数据库服务器端以加密形式存储这些字段。同时,支持对加密数据执行等值和范围查询 。
加密与解密过程:敏感数据在整个生命周期内(包括传输中、静态存储时、使用中、日志中、备份中)都被加密,只有在客户端才会被解密。
自动加密与显式加密:可查询加密可以通过自动加密或显式加密的方式实现。自动加密允许执行加密的读取和写入操作,而无需添加对加密和解密字段的显式调用。显式加密则允许通过 MongoDB 驱动程序的加密库执行加密读写操作,但这需要在应用程序中指定使用此库进行加密的逻辑 。
密钥管理:在生产环境中使用可查询加密时,必须使用远程密钥管理系统(KMS)来存储加密密钥。
自动合并(AutoMerger)
MongoDB 7.0 版本中引入的自动合并器(AutoMerger)是自动均衡器(Balancer)的一个重要组成部分,它旨在优化分片集群中的数据分布。自动合并器会在数据或索引分布不均衡、存在过多分片或进行数据迁移时自动运行,它会自动合并满足特定合并要求的 chunks。每隔 autoMergerIntervalSecs 秒执行一次自动合并操作。管理员可以通过 configureCollectionBalancing 命令启用或禁用自动合并器,例如:
db.adminCommand({
configureCollectionBalancing: "<db>.<collection>",
chunkSize: <num>,
defragmentCollection: <bool>,
enableAutoMerger: <bool>
})
新的聚合操作符:$median 和 $percentile
$median 聚合操作符:用于计算输入值的中位数。中位数是将数值按大小顺序排列后位于中间的值。如果输入值的数量是奇数,中位数就是中间的数值;如果是偶数,则中位数是中间两个数值的平均值。如下示例按 category 分组,并计算每个组的 value 字段的中位数。
db.collection.aggregate([
{
$group: {
_id: "$category",
medianValue: { $median: { input: "$value" } }
}
}
])
$percentile 操作符:用于计算输入数组中指定百分位的值。百分位是指在一组数据中,有百分之多少的数据项小于或等于这个值。如下示例按 category 分组,并计算每个组的 value 字段的 90 百分位数。
db.collection.aggregate([
{
$group: {
_id: "$category",
percentileValue: { $percentile: { input: "$value", p: 0.90, method: "approximate" } }
}
}
])
复合通配符索引(Compound Wildcard Indexes)
MongoDB 7.0 版本中引入的复合通配符索引(Compound Wildcard Indexes)是一项新特性,允许在多个字段上创建索引,其中可以包含一个通配符项和多个非通配符项。这种索引对于具有灵活模式的文档特别有用,即文档字段名称在集合中可能不同。如下示例,使用 wildcardProjection 来指定索引中应包含哪些子字段。通配符索引项 $**
指定集合中的每个字段,而 wildcardProjection 限制索引到指定的字段 "customFields.addr"和 "customFields.name"。更多信息,请参见 Compound Wildcard Indexes。 db.runCommand({
createIndexes: "salesData",
indexes: [
{
key: {
tenantId: 1,
"$**": 1
},
name: "tenant_customFields_projection",
wildcardProjection: {
"customFields.addr": 1,
"customFields.name": 1
}
}
]
})
其他特性
慢查询日志增加了新的字段 catalogCacheIndexLookupDurationMillis,用于记录操作在索引缓存中获取索引信息所花费的时间,有助于更精确地分析和诊断查询性能问题,特别是在涉及索引查找的操作中。具体信息,请参见 log messages for slow queries。 安全性提升,支持 KMIP 1.0和1.1,以及 OpenSSL 3.0和 OpenSSL FIPS,增强了数据安全性。
元数据一致性检查,MongoDB 7.0 版本中引入的 checkMetadataConsistency 命令用于检查分片集群中的元数据一致性问题。
本页内容是否解决了您的问题?