- MongoDB CRUD 操作 >
- MongoDB CRUD 概念 >
- Query Optimization >
- 优化查询性能
优化查询性能¶
On this page
创建索引优化查询¶
对于一般场景下发布的查询,创建 indexes。如果查询搜索了多个字段,创建 compound index。扫描索引要比扫描一个集合快得多。索引结构比文档引用要小,并且有序地存储着文档引用。
示例
If you have a posts collection containing blog posts, and if you regularly issue a query that sorts on the author_name field, then you can optimize the query by creating an index on the author_name field:
db.posts.createIndex( { author_name : 1 } )
索引还能提升在指定字段上进行常规排序的查询的效率。
示例
If you regularly issue a query that sorts on the timestamp field, then you can optimize the query by creating an index on the timestamp field:
创建如下索引:
db.posts.createIndex( { timestamp : 1 } )
被优化的查询:
db.posts.find().sort( { timestamp : -1 } )
由于MongoDB能以升序和降序两种顺序读取索引,所以单一键的索引的方向并不重要。
索引支持查询、更新操作,以及 aggregation pipeline 的某些阶段。
Index keys that are of the BinData type are more efficiently stored in the index if:
其二进制子类型的值在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() 来帮助性能测试,或者在某些你必须选择一个字段或字段被多个索引包含的查询上使用它。
使用增量操作符在服务端执行操作¶
Use MongoDB’s $inc operator to increment or decrement values in documents. The operator increments the value of the field on the server side, as an alternative to selecting a document, making simple modifications in the client and then writing the entire document to the server. The $inc operator can also help avoid race conditions, which would result when two application instances queried for a document, manually incremented a field, and saved the entire document back at the same time.