MongoDB Performance Optimization
MongoDB真的遇到性能瓶颈了吗? 对于查询优化,还可以做到哪些?
##关于服务器硬件
- MongoDB使用内存映射文件I/O来访问数据存储,所以受到了OS以及内存大小的限制.64bit的Linux最大虚拟内存地址为128TB,而Windows对内存映射文件的限制为8TB(如果开启日志则只有4TB)
- 由于映射机制MongoDB会用尽RAM,不过OS会按需将内存释放给其他进程
- 通过提供合适大小的内存,MongoDB可以在内存中保持它的所需数据,由此减少磁盘I/O
##确认工作集大小
常规操作只会访问到整个库中的一部分数据,我们应该根据常用数据合理的计算硬件投入.
##官方推荐硬件标配
- RAID-10
- 云 Amazon Provision IOPS
- 复制集或备份库,应该考虑添加额外网卡形成单独网络
- 重中之重还是RAM
##评估查询性能
对于性能评估Mongo提供了两个工具:
- explain() ==> 单个查询评估
- MongoDB分析器 ==> 分析神器,它会记录统计信息以及查询执行的细节反馈到system.profile表,可以通过它发现慢查询原因.
其实我们已经发现$group是最慢的,所以应该减少group操作.另外对于不同的集合,应该调整不同的查询策略,或许换一下聚合的顺序就会大大提升查询速度.
##MongoDB分析器
- 启用分析器
|
|
- 找到执行超过半秒的查询
|
|
- 分析级别设置为2,对所有查询启用分析器,汇集的结果到了system.profile
|
|
- 如何分析system.profile的日志
|
|
如上,找出了所有耗时50ms以上的查询.