Back to Blogs
mongodb
performance optimization

MongoDB 性能优化

Soloman
2020-07-07

MongoDB 性能优化

优化建议

1. 文档中的_id键推荐使用默认值。MongoDB在指定_id与不指定_id插入时,速度相差很大,指定_id会减慢插入的速率。
2. 推荐使用短字段名,MongoDB集合中的每一个文档都需要存储字段名,长字段名会需要更多的存储空间。
3. MongoDB索引可以提高文档的查询、更新、删除、排序操作,所以结合业务需求,适当创建索引。每个索引都会占用一些空间,并且导致插入操作的资源消耗,因此,建议每个集合的索引数尽量控制在5个以内。 对于包含多个键的查询,创建包含这些键的复合索引是个不错的解决方案。复合索引的键值顺序很重要,理解索引最左前缀原则。 TTL 索引(time-to-live index,具有生命周期的索引),使用TTL索引可以将超时时间的文档老化,一个文档到达老化的程度之后就会被删除。
4. 查询中的某些$操作符可能会导致性能低下,如$ne,$not,$exists,$where,$nin,$or,$in,尽量在业务中不要使用。
5. 固定集合capped collection可以用于记录日志,其插入数据更快,可以实现在插入数据时,淘汰最早的数据。需求分析和设计时,可考虑此特性,既提高了性能,又省去了删除动作。固定集合需要显式创建,指定Size的大小,还能够指定文档的数量。集合不管先达到哪一个限制,之后插入的新文档都会把最老的文档替换移出。
6. 用$or时把匹配最多结果的条件放在最前面,用$and时把匹配最少结果的条件放在最前面。
7. 使用limit()和skip()限定返回结果集的大小,减少数据库服务器的资源消耗,以及网络传输的数据量。
8. 查询量大、并发大的情况,通过前端加缓存解决。
9. 只查询返回要使用的字段,而不查询返回所有字段。如mongoengine的 exclude() 和 only() 方法。
10. 尽量把更多的操作放在客户端,当然这就是mongodb设计的理念之一。
11. 必要时使用hint()强制使用某个索引查询。也可使用hint({"$natural":true})强制查询走全表扫描。
12. 查询的key建议用引号括起来,这样容易和前端的JSON数据互相转换和兼容。
13. 批量插入数据,尽量一次执行多个文档,而不是多个文档执行多次方法。
14. 更新数据时,需要确保value的数据结构,是字符串,是集合,还是对象,不能破坏原有的数据结构。尽量使用修改器来完成操作。修改器比更新数据的方法效率高。常用的修改器:

$inc: 数值类型属性自增
$set: 用来修改文档中的指定属性
$unset: 用来删除文档的指定属性
$push: 向数组属性添加数据
$addToSet: 向数组添加不重复的数据

15. 删除数据是一个非常谨慎的操作,实际开发中不会物理删除数据,只是逻辑删除is_delete=0x01。方便数据恢复和大数据分析。