面试题答案
一键面试分析查询语句性能
- 开启慢查询日志:
- 在MongoDB配置文件(通常是
mongod.conf
)中设置slowOpThresholdMs
参数,例如设置为50(表示50毫秒,可根据实际情况调整),这样执行时间超过50毫秒的查询会被记录到慢查询日志中。 - 配置示例:
operationProfiling: slowOpThresholdMs: 50 mode: "slowOp"
- 重启MongoDB服务使配置生效。
- 在MongoDB配置文件(通常是
- 使用
explain()
分析查询:- 在查询语句后使用
explain()
方法,例如对于集合users
查询年龄大于30的文档:
db.users.find({age: {$gt: 30}}).explain()
explain()
返回的结果中,queryPlanner
部分会展示查询规划器选择的查询计划,包括索引使用情况等。executionStats
部分提供执行查询的统计信息,如扫描的文档数、返回的文档数等。通过分析这些信息,可以判断是否使用了合适的索引,如果未使用索引,可能需要创建合适的索引来优化查询。
- 在查询语句后使用
调整内存配置
- 了解内存使用情况:
- 使用
db.serverStatus().mem
命令查看MongoDB当前的内存使用情况。其中resident
表示MongoDB进程常驻内存大小,virtual
表示虚拟内存大小等。
- 使用
- 调整
mmapv1
存储引擎(如果使用)的内存配置:- 预分配数据文件:在启动
mongod
时使用--nopreallocj
选项可以禁用日志文件预分配,减少启动时的磁盘I/O压力。 - 调整数据文件大小:通过
--smallfiles
选项可以让MongoDB创建较小的数据文件,适用于内存有限的场景。
- 预分配数据文件:在启动
- 调整WiredTiger存储引擎的内存配置:
- 配置
wiredTigerCacheSizeGB
:在MongoDB配置文件中设置wiredTigerCacheSizeGB
参数,例如设置为2,表示分配2GB内存给WiredTiger存储引擎的缓存。 - 配置示例:
storage: wiredTiger: engineConfig: cacheSizeGB: 2
- 重启MongoDB服务使配置生效。该缓存用于存储数据和索引,合适的缓存大小可以提高读写性能。
- 配置
索引优化
- 查看索引使用情况:
- 使用
db.collectionName.find({...}).explain()
中的executionStats
部分查看索引是否被使用。如果totalKeysExamined
为0,可能索引未被使用。
- 使用
- 创建合适的索引:
- 根据查询条件创建索引。例如,如果经常按照
name
字段查询,可使用以下命令创建索引:
db.users.createIndex({name: 1})
- 1表示升序索引,-1表示降序索引。对于复合查询,可创建复合索引,如按照
name
和age
查询:
db.users.createIndex({name: 1, age: 1})
- 根据查询条件创建索引。例如,如果经常按照
服务器资源优化
- CPU优化:
- 使用系统工具如
top
查看MongoDB进程是否占用过多CPU。如果是,可能是查询过于复杂或索引不合理。 - 可以考虑升级CPU或优化查询语句和索引来降低CPU使用率。
- 使用系统工具如
- 磁盘I/O优化:
- 使用工具如
iostat
查看磁盘I/O情况。如果磁盘I/O繁忙,对于WiredTiger存储引擎,可以调整checkpoint
频率,在配置文件中设置storage.wiredTiger.engineConfig.checkpointIntervalSecs
参数,适当增大间隔时间可减少磁盘I/O,但可能会增加故障恢复时间。 - 考虑使用更快的存储设备,如SSD,来提高磁盘读写性能。
- 使用工具如