MongoDB性能优化及监控
1. 优化查询操作
在实际使用中,经常会遇到查询操作比较慢的情况。针对这种情况,我们可以采取以下措施:
- 索引优化
- 防止全表扫描,建立索引能够加快查询速度。
-
考虑使用组合索引,以最大限度减少索引占用空间。
-
查询条件优化
- 避免使用复杂的正则表达式。
- 尽量避免像 $where 这样引入自定义代码的操作。
- 确保查询语句的优化,如利用游标或者分片等。
示例说明:
假设我们有一个 users 集合,其中包含了100万个文档,下面是两个查询:
- 通过 _id 查找某个文档
db.users.find({_id:ObjectId("5e75899b3ddc0404072526a5")})
建立 _id 的索引是比较明显的,因此没有必要进行其他优化。
- 查询年龄在 18 到 25 的用户
db.users.find({age:{$gte:18,$lte:25}})
可以新建一个组合索引,包含 age 和 _id:
db.users.ensureIndex({age:1,_id:1})
这可以把查询性能从全表扫描降低到使用索引扫描。
2. 优化Write操作
- 批量插入数据
-
使用 bulkWrite 而不是单条 insert 操作。
-
索引优化
- 索引的写入速度比全表扫描慢多了,因此建议在场景允许的情况下进行数据本身和索引的冗余存储,即保存冗余数据副本,而不是经常进行全表扫描进行查找。
示例说明:
假设我们有一个 sales 订单集合,经常需要进行批量插入操作,下面是优化的示例:
// 构建 bulkWrite 请求
const requests = []
for (let i = 0; i < 100000; i++) {
requests.push({
insertOne: {
document: {
orderId: i,
createTime: new Date(),
quantity: Math.floor(Math.random() * 10) + 1,
price: Math.random() * 100
}
}
})
}
// 执行 bulkWrite 操作
db.sales.bulkWrite(requests)
3. 监控 MongoDB
- 使用 mongostat 工具来监控连接、请求、耗时、IO、网络等。
- 使用 MongoDB 监控工具来收集数据。
- MongoDB Monitoring Service (MMS)
- Ops Manager
示例说明:
假设我们使用 MMS 监控 MongoDB,我们可以根据实际需要进行自定义设置,例如:
- 监控服务器的响应时间
- 关键操作(如备份、恢复、重载、重启等)的执行监控
- 预警监控,如长时间的网络闲置时间、I/O 阻塞、故障检测等。
- 覆盖面广的数据集,如所有服务器的请求量,插入次数,网络流量,磁盘 IO 等。
总结
以上是针对 MongoDB 性能优化及监控的完整攻略,主要包含查询优化、Write 优化和监控三个方面。我们需要根据不同的场景来进行具体的配置和优化。