【问题标题】:Optimising queries in mongodb优化 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 数据库背景。

请帮忙。

【问题讨论】:

    标签: mongodb query-optimization mongodb-java


    【解决方案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})
    猜你喜欢
    • 2019-10-25
    • 2015-01-21
    • 2015-01-09
    • 2015-03-06
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    相关资源
    最近更新 更多