过滤和排序下列哪些查询将使用索引?

问题描述:

有一个集合people用以下指标:过滤和排序下列哪些查询将使用索引?

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

对于两个过滤&排序, 以下哪些查询会使用索引? Which of the following queries will use the index?

  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}

我已经通过下面的问题去了

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

另外,如何确定索引是否用于两个筛选器&排序 或未使用?

+0

加上'.explain();' –

+1

【解释】(https://docs.mongodb.com/manual/reference/explain-results/#executionstats)会告诉你在哪里指数被使用,但作为B-Tree指数的tumb的规则,他们将从左到右工作,从索引中的第一项开始。您可以查看关于B-tree索引的官方*(这里是https://en.wikipedia.org/wiki/B-tree)。同样对于排序将会影响索引的方向(ASC或DESC) –

+0

@Dan Ionescu,复合索引用于向左(而不是从右到左)。所以复合索引的第一个字段可以直接使用,而不是第二个... – JJussi

蒙戈使用来自左即,索引{"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 }它不能是选项,因为排序是在地址城市,所以索引不能乱序使用。
  2. { "first_name": "Jessica" }).sort({ "address.state": 1, "address.city": 1 }它可以是一个选项。为了确保它,我们需要以下运行查询 -

    var ex = db.people.explain(); 
    

    ex.find({ “FIRST_NAME”: “杰西卡”})排序({ “address.state”:1, “address.city”: 1})

上面的查询返回不具有像“舞台”的回应:这告诉我们,那种发生在DB使用指数“排序”。如果我们使用Stage SORT,那么它会告诉您在RAM中发生了排序,而数据库无法在使用索引的数据库中进行排序。

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

    ex.find({ “如first_name”: “杰西卡”, “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>)正在给出“阶段”:“COLLSCAN”那么索引不用于过滤。选项2,3,5在ex.find()响应中没有“stage”:“COLLSCAN”,因此它们使用索引进行过滤。

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

    你也可以为选项1和4运行ex.find(),你将得到“stage”:“COLLSCAN”或“stage”:“SORT”,它告诉索引没有被用于过滤或排序。

    谢谢...

开始=>