过滤和排序下列哪些查询将使用索引?
有一个集合people
用以下指标:过滤和排序下列哪些查询将使用索引?
{"first_name": 1, "address.state": -1, "address.city": -1, "ssn": 1}
对于两个过滤&排序, 以下哪些查询会使用索引? Which of the following queries will use the index?
:{ "first_name": { $gt: "J" } }).sort({ "address.city": -1 }
{ "first_name": "Jessica" }).sort({ "address.state": 1, "address.city": 1 }
{ "first_name": "Jessica", "address.state": { $lt: "S"} }).sort({ "address.state": 1 }
{"address.city":"West Cindy"}).sort({ "address.city":-1}
{"address.state":"South Dakota","first_name": "Jessica"}).sort({ "address.city":-1}
我已经通过下面的问题去了
但它只解释了过滤的索引,我需要使用两个过滤器以及排序功能的索引。
另外,如何确定索引是否用于两个筛选器&排序 或未使用?
蒙戈使用来自左即,索引{"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的任务问题,所以我非常了解数据集。我会一个接一个的去选项 -
-
{ "first_name": { $gt: "J" } }).sort({ "address.city": -1 }
它不能是选项,因为排序是在地址城市,所以索引不能乱序使用。 -
{ "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中发生了排序,而数据库无法在使用索引的数据库中进行排序。
-
{ "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能够使用索引进行排序。
{"address.city":"West Cindy"}).sort({ "address.city":-1}
忽略此操作是因为索引不是从左侧开始的。{"address.state":"South Dakota","first_name": "Jessica"}).sort({ "address.city":-1}
这与选项2相同。我执行了类似的查询,但没有得到任何SORT阶段,因此它使用索引进行排序。
使用索引进行过滤很容易识别。如果ex.find(<Your query>)
正在给出“阶段”:“COLLSCAN”那么索引不用于过滤。选项2,3,5在ex.find()响应中没有“stage”:“COLLSCAN”,因此它们使用索引进行过滤。
这样我确保所有选项都使用索引进行过滤和排序。
你也可以为选项1和4运行ex.find(),你将得到“stage”:“COLLSCAN”或“stage”:“SORT”,它告诉索引没有被用于过滤或排序。
谢谢...
加上'.explain();' –
【解释】(https://docs.mongodb.com/manual/reference/explain-results/#executionstats)会告诉你在哪里指数被使用,但作为B-Tree指数的tumb的规则,他们将从左到右工作,从索引中的第一项开始。您可以查看关于B-tree索引的官方*(这里是https://en.wikipedia.org/wiki/B-tree)。同样对于排序将会影响索引的方向(ASC或DESC) –
@Dan Ionescu,复合索引用于向左(而不是从右到左)。所以复合索引的第一个字段可以直接使用,而不是第二个... – JJussi