1. performancemonitor
has 效 performancemonitor is optimizationMongoDBperformance Basics, throughmonitor关键指标, 可以及时发现performance瓶颈并采取相应 optimization措施.
1.1 in 置monitortool
// 查看serverstatus
db.serverStatus()
// 查看datalibrarystatisticsinformation
db.stats()
// 查看collectionstatisticsinformation
db.collection.stats()
// 查看当 before operation
db.currentOp()
// 查看 slow querylog
// in configurationfilein启用:
// operationProfiling: {
// slowOpThresholdMs: 100,
// mode: "slowOp"
// }
// 查看 slow query
db.system.profile.find().sort({ ts: -1 })
1.2 关键monitor指标
| 指标class别 | 具体指标 | 理想值 | monitortool |
|---|---|---|---|
| operationperformance | queryresponse时间 | < 100ms | slow querylog |
| operationperformance | 写operationlatency | < 50ms | serverStatus |
| 连接 | 活跃connections | < 80% 最 big connections | serverStatus |
| memory | WiredTigercacheusing率 | < 80% | serverStatus |
| disk | IOPSusing率 | < 70% | operationsystemtool |
| copy | copylatency | < 10s | rs.printSlaveReplicationInfo() |
1.3 out 部monitortool
- MongoDB Atlas: 官方云monitorservice, providing全面 performance指标 and 告警
- MongoDB Compass: graph形化managementtool, package含performancemonitor面板
- Prometheus + Grafana: usingMongoDB exporter收集指标, Grafanavisualization
- Nagios/Zabbix: through插件monitorMongoDBperformance
- Datadog: providingMongoDB集成, 全面monitorperformance指标
2. queryoptimization
query is MongoDBperformance 关键因素, optimizationquery可以显著提升datalibraryperformance.
2.1 indexoptimization
- creation合适 index: for 常用query字段creationindex
- 复合index顺序: 将选择性 high 字段放 in before 面
- 覆盖index: package含query所需 所 has 字段
- 避免index过度: 过 many index会影响写performance
- usingindex提示: in complex queryin指定using index
// creation复合index
db.collection.createIndex({ "userId": 1, "createdAt": -1 })
// creation覆盖index
db.collection.createIndex({ "status": 1, "total": 1 }, { "name": "status_total_idx" })
// usingindex提示
db.collection.find({ "userId": 123, "status": "active" }).hint({ "userId": 1 })
// 查看indexusingcircumstances
db.collection.explain("executionStats").find({ "userId": 123 })
2.2 query模式optimization
- 避免全collection扫描: 确保queryusingindex
- 限制返回字段: using投影reducingnetwork传输
- 合理using批量operation: reducingnetwork往返
- 避免using $where operation符: performance较差
- 避免using正则表达式开头: such as /^pattern/ 无法usingindex
- usingaggregate管道时注意memory限制: 默认100MB
// 限制返回字段
db.collection.find({ "status": "active" }, { "name": 1, "email": 1, "_id": 0 })
// using批量插入
db.collection.insertMany([
{ "name": "Item 1", "price": 10 },
{ "name": "Item 2", "price": 20 },
{ "name": "Item 3", "price": 30 }
])
// optimizationaggregatequery
db.collection.aggregate([
{ $match: { "status": "completed" } }, // 先filter, reducingdata量
{ $group: { _id: "$category", total: { $sum: "$amount" } } },
{ $sort: { total: -1 } },
{ $limit: 10 } // 限制结果集 big small
])
2.3 分页optimization
传统 skip-limit分页 in processing big 量data时performance较差, 推荐using游标分页:
// 传统分页 (不推荐用于 big data集)
db.collection.find().skip(10000).limit(10)
// 游标分页 (推荐)
// 按_id分页
const lastId = ObjectId("...")
db.collection.find({ "_id": { "$gt": lastId } }).limit(10)
// 按时间字段分页
const lastTime = new Date("2023-01-01")
db.collection.find({ "createdAt": { "$gt": lastTime } }).sort({ "createdAt": 1 }).limit(10)
3. 硬件configuration
适当 硬件configuration is MongoDBperformance Basics, 根据工作load选择合适 硬件可以显著提升performance.
3.1 memoryconfiguration
- 足够 memory: MongoDBusingmemorycachedata, 建议memory至 few 能容纳活跃data集
- WiredTigercache: 默认 for RAM 50%, 可根据需要调整
- operationsystemcache: 留足memory给operationsystemcache
// 调整WiredTigercache big small
// in configurationfilein设置:
// store: {
// wiredTiger: {
// engineConfig: {
// cacheSizeGB: 4
// }
// }
// }
3.2 storeconfiguration
- SSDstore: 相比HDD, SSD可显著提升IOperformance
- RAIDconfiguration: usingRAID 10improvingperformance and reliability
- filesystem: 推荐usingXFS or EXT4
- diskIOscheduling: usingdeadline or nonescheduling器
3.3 CPUconfiguration
- many 核CPU: MongoDB可以利用 many 核parallelprocessingrequest
- CPU频率: for 于 high concurrent场景, high 频率CPU更 important
- CPUcache: 更 big CPUcache可以improvingperformance
3.4 networkconfiguration
- networkbandwidth: 确保足够 networkbandwidth, 特别 is in copy集 and shardclusterin
- networklatency: 降 low node间networklatency, using本地network
- connections限制: 根据servercapacity设置合理 connections限制
4. 调优策略
除了monitor and 硬件configuration, 还需要采取一系列调优策略来提升MongoDBperformance.
4.1 datamodeloptimization
- 合理using嵌入 and 引用: 根据query模式选择合适 relationshipsmodel
- 避免documentation过 big : 单个documentation big small 限制 for 16MB
- usingarray时注意 big small : 过 big array会影响performance
- 预计算字段: for 于频繁计算 值, using预计算字段
// 反范式designexample (嵌入评论)
db.blogs.insertOne({
"title": "MongoDB Performance Tuning",
"content": "...",
"author": "John",
"comments": [
{ "user": "Alice", "content": "Great post!", "date": new Date() },
{ "user": "Bob", "content": "Very helpful", "date": new Date() }
],
"commentCount": 2, // 预计算字段
"lastCommentDate": new Date() // 预计算字段
})
// 引用designexample (分离评论)
db.blogs.insertOne({
"_id": ObjectId("..."),
"title": "MongoDB Performance Tuning",
"content": "...",
"author": "John"
})
db.comments.insertMany([
{ "blogId": ObjectId("..."), "user": "Alice", "content": "Great post!", "date": new Date() },
{ "blogId": ObjectId("..."), "user": "Bob", "content": "Very helpful", "date": new Date() }
])
4.2 configurationoptimization
- 连接池设置: 合理configurationapplication程序连接池 big small
- 写关注点: 根据datasecurityrequirements选择合适 写关注点
- 读偏 good : in copy集inusing合适 读偏 good
- 批量 big small : 调整批量operation big small
// 设置写关注点 ( high security性)
db.collection.insertOne({ "name": "Item" }, { writeConcern: { "w": "majority", "wtimeout": 5000 } })
// 设置读偏 good ( from from node读取)
db.collection.find().readPref("secondaryPreferred")
// 调整批量 big small
db.collection.find().batchSize(100)
4.3 application程序optimization
- reducingdatalibraryoperation: merge many 个operation, reducingnetwork往返
- using批量operation: 批量插入, update and delete
- cache常用data: usingRedisetc.cachereducingdatalibraryquery
- asynchronousprocessing: 将非关键operationasynchronousprocessing
- 连接management: using连接池, 避免频繁creation and 关闭连接
4.4 定期maintenance
- 碎片整理: 定期runcompactcommands整理碎片
- index重建: for 于经常update collection, 定期重建index
- log轮换: 定期轮换logfile, 避免disk空间不足
- backup: 定期backupdata, 确保datasecurity
// 整理collection碎片
db.runCommand({ compact: "collectionName" })
// 重建index
db.collection.reIndex()
// 查看collection碎片circumstances
db.collection.stats().indexSizes
5. 实践case: optimization电商systemMongoDBperformance
fake设我们 has 一个电商system, MongoDBperformance出现瓶颈, 需要foroptimization, 具体步骤such as under :
5.1 performanceanalysis
// 1. 查看 slow query
db.system.profile.find({ millis: { $gt: 100 } }).sort({ millis: -1 })
// 2. analysisquery执行计划
db.orders.explain("executionStats").find({ "userId": ObjectId("..."), "status": "completed" })
// 3. 查看collectionstatisticsinformation
db.orders.stats()
// 4. 查看index
db.orders.getIndexes()
5.2 optimization措施
- indexoptimization: for 常用query字段creation复合index
- datamodeloptimization: for 频繁访问 商品informationusing嵌入, reducing关联query
- queryoptimization: 限制返回字段, using批量operation
- 硬件upgrade: 将store from HDDupgrade to SSD
- cache策略: usingRediscache热门商品 and classificationdata
// creation复合index
db.orders.createIndex({ "userId": 1, "status": 1, "createdAt": -1 })
// optimizationdatamodel (嵌入商品information)
db.orders.insertOne({
"userId": ObjectId("..."),
"status": "completed",
"createdAt": new Date(),
"items": [
{
"productId": ObjectId("..."),
"name": "Product Name", // 嵌入商品名称
"price": 99.99, // 嵌入商品价格
"quantity": 2
}
],
"total": 199.98 // 预计算总价
})
// optimizationquery (限制返回字段)
db.orders.find(
{ "userId": ObjectId("..."), "status": "completed" },
{ "items": 1, "total": 1, "createdAt": 1, "_id": 0 }
).sort({ "createdAt": -1 }).limit(10)
5.3 monitorverification
实施optimization措施 after , 需要持续monitorperformance指标, verificationoptimization效果:
- queryresponse时间 is 否降 low
- systemthroughput is 否improving
- serverresourceusing率 is 否合理
- slow query数量 is 否reducing
6. 互动练习
issues1: 以 under 哪个 is MongoDBperformancemonitor in 置commands?
A. db.monitor()
B. db.serverStatus()
C. db.performance()
D. db.statsAll()
issues2: for 于MongoDBstore, 以 under 哪种configurationperformance最 good ?
A. HDD + RAID 5
B. SSD + RAID 10
C. HDD + RAID 10
D. SSD + RAID 0
issues3: 以 under 哪种query模式无法usingindex?
A. db.collection.find({ "name": "John" })
B. db.collection.find({ "age": { "$gt": 18 } })
C. db.collection.find({ "name": { "$regex": /^Jo/ } })
D. db.collection.find({ "name": { "$regex": /hn$/ } })
issues4: MongoDB单个documentation big small 限制 is how many?
A. 4MB
B. 8MB
C. 16MB
D. 32MB