说明:
基于插槽的查询执行引擎性能提升
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}}]})
其他特性
ChangeStream 支持超大变更事件,新增了 $changeStreamSplitLargeEvent 阶段,支持对超过16MB的超大变更事件进行切分。具体信息,请参见 Large Change Stream Events。
慢查询日志增加了新的字段 catalogCacheIndexLookupDurationMillis,用于记录操作在索引缓存中获取索引信息所花费的时间,有助于更精确地分析和诊断查询性能问题,特别是在涉及索引查找的操作中。具体信息,请参见 log messages for slow queries。
WT 引擎动态限流:自动动态调整WT存储引擎的事务并发度,以优化数据库在高负载下的性能。具体信息,请参见 Concurrent Storage Engine Transactions。
安全性提升,支持 KMIP 1.0和1.1,以及 OpenSSL 3.0和 OpenSSL FIPS,增强了数据安全性。
新增了用于监控 Chunk 迁移的统计指标。具体信息,请参见 New Sharding Statistics for Chunk Migrations。
元数据一致性检查,MongoDB 7.0 版本中引入的 checkMetadataConsistency 命令用于检查分片集群中的元数据一致性问题。