OPTIONS
翻译或纠错本页面

优化查询性能

创建索引优化查询

对于一般场景下发布的查询,创建 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.ensureIndex( { 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.ensureIndex( { 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 集合的查询,你只需要 timestamptitleauthorabstract 字段,你可以使用如下命令:

db.posts.find( {}, { timestamp : 1 , title : 1 , author : 1 , abstract : 1} ).sort( { timestamp : -1 } )

更多关于如何使用映射的信息,请参见 限制查询返回的字段

使用 $hint 选择一个特定的索引

在大多数情况下, query optimizer 能对指定的操作选择最优的索引;不过,你可以使用 hint() 方法强制MongoDB使用指定的索引。你可以使用 hint() 来帮助性能测试,或者在某些你必须选择一个字段或字段被多个索引包含的查询上使用它。

使用增量操作符在服务端执行操作

使用MongoDB的 $inc 操作符增加或减少文档中的值。作为选出文档,在客户端简单更改后把整个文档写入服务器的替代,该操作符在服务端增加字段的值。 $inc 操作符还可以避免当两个应用实例同时查询一个文档,手动增加某个字段的值后把整个文档存回数据库时导致的竞态条件。