优化 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 中的查询的主要内容,如果未能解决你的问题,请参考以下文章