优化查询性能
创建索引以支持查询
对于常见的查询,创建索引。如果一个查询搜索多个字段,则创建一个 组合索引。扫描索引比扫描集合快得多。索引结构比文档引用小,并按顺序存储引用。
示例
如果您有一个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
运算符还可以帮助避免竞争条件,这种条件发生在两个应用程序实例同时查询文档、手动增加字段并保存整个文档时。