MongoDB的性能优化总结

监控

可以通过开启profile监控查询,通常设置为db.getProfilingLevel(1)来监控慢查询,定位到具体的慢查询再具体分析。

执行db.system.profile.find({millis:{$gt:500}})能够返回查询时间在500毫秒以上的查询命令。

索引

如果查询的时间较长,首先要考虑的是索引是否建立。是否可以优化。要注意的是,索引列的颗粒要小(所匹配的数据应该要少),应该优先将颗粒小的列,放在左侧(去除大量数据,在一个较小的集合中查询)

通过explain优化查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
db.TBL.find({phone: {$regex: "138*"}}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "Examle.TBL",
"indexFilterSet" : false,
"parsedQuery" : {
"phone" : {
"$regex" : "138*"
}
},
"queryHash" : "1722BD8D",
"planCacheKey" : "E07652F2",
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"filter" : {
"phone" : {
"$regex" : "138*"
}
},
"keyPattern" : {
"phone" : 1
},
"indexName" : "phone_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"phone" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"phone" : [
"[\"\", {})",
"[/138*/, /138*/]"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "test-server",
"port" : 27017,
"version" : "4.2.15",
"gitVersion" : "d7fd78dead621a539c20791a93abec34bb1be385"
},
"ok" : 1
}

数据库设计

要Review数据库表的设计是否可以优化,是否有必要拆表,合表等等

其他方法

  • ssd是不是可以考虑
  • 文件系统有没有影响
  • 如果是集群,网络有没有优化空间