优化 mongodb 中的查询

Posted

技术标签:

【中文标题】优化 mongodb 中的查询【英文标题】:Optimising queries in mongodb 【发布时间】:2016-04-06 10:15:38 【问题描述】:

我正在优化我在 mongodb 中的查询。

在普通的 sql 查询中,where 子句的应用是有顺序的。例如select * from employees where department="dept1" and floor=2 and sex="male",这里首先应用department="dept1",然后应用floor=2,最后应用sex="male"

我想知道它在 mongodb 中是否以类似的方式发生。 例如。 DbObject search = new BasicDbObject("department", "dept1").put("floor",2).put("sex", "male"); 这里首先应用哪个 match 子句,或者事实上 mongo 完全以这种方式工作。

这个问题基本上来自我的 SQL 数据库背景。

请帮忙。

【问题讨论】:

【参考方案1】:

如果没有索引,我们必须扫描整个集合(collection scan)才能找到所需的文档。在您的情况下,如果您想申请订单 [部门、楼层和性别],您应该创建这个复合索引:

db.employees.createIndex(  "department": 1, "floor": 1, "sex" : 1  )

作为文档:https://docs.mongodb.org/manual/core/index-compound/

db.products.createIndex( "item": 1, "stock": 1 )

复合索引中字段的顺序非常重要。在里面 前面的示例,索引将包含对文档的引用 首先按 item 字段的值排序,并且在每个值中 item 字段,按 stock 字段的值排序。

【讨论】:

当我使用索引中的字段子集(如"department" : "dept"1, "floor" : 2"floor" : 2)进行查询时,像db.employees.createIndex( "department": 1, "floor": 1, "sex" : 1 ) 这样的复合索引是否有帮助 检查并向下滚动我的答案 docs.mongodb.org/manual/core/index-compound/#prefixes 中的参考。在您的情况下,索引 "department": 1, "floor": 1, "sex" : 1 将帮助您查询:(1) dep, (2) dep/floor 和 (3) dep/floor/性别。如果您想快速按楼层搜索,您必须创建另一个索引 还有一件事——假设没有索引,那么首先应用哪个匹配子句。有什么规定吗? 正如我所说:“如果没有索引,我们必须扫描整个集合(集合扫描)才能找到所需的文档。”您可以使用 explain() 方法检查执行查询的不同方法:db.employees.createIndex( "department": 1, "floor": 1, "sex" : 1 ),创建复合索引,以及, 为您的不同字段提供单个索引,然后删除复合索引,同时始终检查解释结果中的“获胜计划” 用投影更好地执行这个查询: db.employees.createIndex( "department": 1, "floor": 1, "sex" : 1 , _id: 0, department: 1,楼层:1,性别:1)

以上是关于优化 mongodb 中的查询的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB优化的几点原则

MongoDB优化的几点原则

Mongodb 3 查询优化

MongoDB查询优化

mongodb的find查询10万条以上的数据有卡顿现象,请问如何选择优化的方式

优化 MongoDB 聚合查询性能