优化查询性能
创建索引以支持查询
对于常用查询,请创建索引。 如果查询搜索多个字段,请创建复合索引。 扫描索引比扫描集合快得多。 索引结构小于文档引用,并按顺序存储引用。
例子
如果您有一个包含多个博文的 集合,并且您定期发出对 posts
字段进行排序的查询,则可以通过对 author_name
author_name
字段创建索引来优化查询:
db.posts.createIndex( { author_name : 1 } )
此外,索引还能提高定期对给定字段进行排序的查询的效率。
例子
如果您定期发出对 timestamp
字段进行排序的查询,则可通过对 timestamp
字段创建索引来优化查询:
创建此索引:
db.posts.createIndex( { timestamp : 1 } )
优化此查询:
db.posts.find().sort( { timestamp : -1 } )
由于 MongoDB 可按升序和降序读取索引,因此单键索引的方向并不重要。
索引支持查询、更新操作和聚合管道的某些阶段。
如果满足以下条件,则 BinData
类型的索引键可以更有效地存储在索引中:
二进制子类型值的范围是 0-7 或 128-135,并且
字节数组的长度为:0、1、2、3、4、5、6、7、8、10、12、14、16、20、24 或 32。
限制查询结果数量以减少网络需求
MongoDB 游标以多个文档群组的形式返回结果。如果知道想要的结果数量,则可以通过发出 limit()
方法来减少对网络资源的需求。
这通常与排序操作结合使用。例如,如果您只需要从对 posts
集合的查询中获取 10 个结果,则可以发出以下命令:
db.posts.find().sort( { timestamp : -1 } ).limit(10)
有关限制结果的更多信息,请参阅 limit()
使用投影仅返回必要的数据
当您只需要文档中的部分字段时,可通过仅返回所需字段来实现更优性能:
例如,在针对 posts
集合的查询中,您仅需 timestamp
、title
、author
和 abstract
字段,则可发出以下命令:
db.posts.find( {}, { timestamp : 1 , title : 1 , author : 1 , abstract : 1} ).sort( { timestamp : -1 } )
有关使用投影的更多信息,请参阅投影要从查询返回的字段。
使用$hint
选择特定索引
大多数情况下,查询优化器会为特定操作选择最佳索引;但是,您可使用 hint()
方法强制 MongoDB 使用特定索引。使用 hint()
来支持性能测试,或将其用于必须选择某一字段或包含在多个索引中的某一字段的某些查询。
使用增量运算符执行服务器端操作
使用 MongoDB 的 $inc
运算符来递增或递减文档中的值。作为选择文档操作的替代方法,此运算符会在服务器端递增该字段的值,从而在客户端进行简易修改,然后将整个文档写入服务器。$inc
运算符还有助于避免出现争用情况;当两个应用程序实例查询是否存在某一文档、手动递增某一字段并同时保存回整个文档时,便会出现争用情况。