Filtering&排序以下哪些查询将使用索引?

时间:2017-02-28 06:50:50

标签: mongodb sorting filter mongodb-query mongodb-indexes

有一个集合people,其中包含以下索引:

{"first_name": 1, "address.state": -1, "address.city": -1, "ssn": 1}

对于过滤和过滤排序下, 以下哪个查询将使用索引?

  1. { "first_name": { $gt: "J" } }).sort({ "address.city": -1 }
  2. { "first_name": "Jessica" }).sort({ "address.state": 1, "address.city": 1 }
  3. { "first_name": "Jessica", "address.state": { $lt: "S"} }).sort({ "address.state": 1 }
  4. {"address.city":"West Cindy"}).sort({ "address.city":-1}
  5. {"address.state":"South Dakota","first_name": "Jessica"}).sort({ "address.city":-1}
  6. 我已经通过以下问题: Which of the following queries will use the index?

    但它只解释了过滤的索引,我需要为过滤器使用索引以及排序功能。

    此外,我如何确定索引是否用于过滤器和放大器。分类 或未使用?

1 个答案:

答案 0 :(得分:2)

Mongo使用Left中的索引,即{"first_name": 1, "address.state": -1, "address.city": -1, "ssn": 1}索引可以应用于下面的字段查询 -

  • {“first_name”:1,“address.state”: - 1,“address.city”: - 1,“ssn”:1}
  • {“first_name”:1,“address.state”: - 1,“address.city”: - 1}
  • {“first_name”:1,“address.state”: - 1}
  • {“first_name”:1}

还应该注意,顺序对复合指数很重要。

回答问题,我知道这是M201课程实验2.1的作业问题,所以我很清楚数据集。我会一个接一个地选择 -

  1. { "first_name": { $gt: "J" } }).sort({ "address.city": -1 }它不能是选项,因为sort在地址城市上,所以索引不能不按顺序使用。
  2. { "first_name": "Jessica" }).sort({ "address.state": 1, "address.city": 1 }这可以是一个选项。为了确保它,我们需要运行以下查询 -

    var ex = db.people.explain();
    

    ex.find({“first_name”:“Jessica”})。sort({“address.state”:1,“address.city”:1})

  3. 上面的查询返回一个没有类似“stage”的响应:“SORT”,它告诉我们使用索引在DB中发生排序。如果我们有Stage SORT,那么它会告诉RAM中发生了排序,DB无法使用索引在数据库中进行排序。

    1. { "first_name": "Jessica", "address.state": { $lt: "S"} }).sort({ "address.state": 1 }我和选项2一样。

      ex.find({“first_name”:“Jessica”,“address.state”:{$ lt:“S”}})。sort({“address.state”:1}) 上面的输出没有任何SORT阶段,表明DB能够使用索引进行排序。

    2. {"address.city":"West Cindy"}).sort({ "address.city":-1}忽略此原因,因为索引不在左侧。

    3. {"address.state":"South Dakota","first_name": "Jessica"}).sort({ "address.city":-1}这与选项2相同。我执行了类似的查询,没有得到任何SORT阶段,所以它使用索引进行排序。

    4. 使用索引进行过滤非常容易识别。如果ex.find(<Your query>)正在提供“stage”:“COLLSCAN”,那么index不会用于过滤。选项2,3,5在ex.find()响应中没有“stage”:“COLLSCAN”,所以它们使用索引进行过滤。

      这样我确保所有选项都使用索引进行过滤和排序。

      您还可以为选项1和4运行ex.find(),然后您将获得“stage”:“COLLSCAN”或“stage”:“SORT”,表示索引未分别用于过滤或排序。 / p>

      谢谢...