文档菜单
文档首页
/
MongoDB 手册
/ / /

优化查询性能

本页内容

  • 创建索引以支持查询
  • 限制查询结果数量以减少网络需求
  • 使用投影返回必要数据
  • 使用$hint 选择特定索引
  • 使用增量操作在服务器端执行操作

对于常见的查询,创建索引。如果一个查询搜索多个字段,则创建一个 组合索引。扫描索引比扫描集合快得多。索引结构比文档引用小,并按顺序存储引用。

示例

如果您有一个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 集合的查询中,您只需要 timestamptitleauthorabstract 字段,您将执行以下命令

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

有关使用投影的更多信息,请参阅从查询结果中投影字段。

在大多数情况下,查询优化器会选择特定操作的优化索引;但是,您可以使用hint()方法强制MongoDB使用特定索引。使用hint()来支持性能测试,或在某些查询中,您必须选择包含在多个索引中的字段。

使用MongoDB的$inc运算符在文档中增加或减少值。该运算符在服务器端增加字段的值,作为选择文档、在客户端进行简单修改然后将整个文档写入服务器的替代方案。该$inc运算符还可以帮助避免竞争条件,这种条件发生在两个应用程序实例同时查询文档、手动增加字段并保存整个文档时。

返回

阻止慢查询