优化查询性能
在本页面
创建索引以支持查询
对于常见的查询,请创建indexes。如果查询搜索多个字段,请创建compound index。扫描索引比扫描集合快得多。索引结构小于文档参考,并按 Sequences 存储参考。
Example
如果您有一个包含博客post的posts
集合,并且您定期发出对author_name
字段排序的查询,则可以通过在author_name
字段上创建索引来优化查询:
db.posts.createIndex( { author_name : 1 } )
索引还可以提高对按给定字段进行常规排序的查询的效率。
Example
如果您定期发出在timestamp
字段上排序的查询,则可以通过在timestamp
字段上创建索引来优化查询:
创建该索引:
db.posts.createIndex( { timestamp : 1 } )
优化此查询:
db.posts.find().sort( { timestamp : -1 } )
由于 MongoDB 可以按升序和降序读取索引,因此单键索引的方向无关紧要。
索引支持查询,更新操作以及aggregation pipeline的某些阶段。
如果满足以下条件,则更有效地将BinData
类型的索引键存储在索引中:
-
二进制子类型的值在 0-7 或 128-135 的范围内,并且
-
字节数组的长度为:0、1、2、3、4、5、6、7、8、10、12、14、16、20、24 或 32.
限制查询结果的数量以减少网络需求
MongoDB cursors以多个文档为一组返回结果。如果知道所需的结果数量,则可以通过发出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 选择特定索引
在大多数情况下,query optimizer为特定操作选择最佳索引;但是,您可以通过hint()方法强制 MongoDB 使用特定索引。使用hint()支持性能测试,或者在某些查询上必须选择一个或多个索引中包含的字段,以支持性能测试。
使用增量运算符在服务器端执行操作
使用 MongoDB 的$inc运算符可递增或递减文档中的值。作为选择文档,在 Client 端中进行简单修改,然后将整个文档写入服务器的替代方法,操作员在服务器端增加该字段的值。 $inc运算符还可以帮助避免争用情况,这是当两个应用程序实例查询一个文档,手动增加一个字段并同时保存整个文档时导致的。