我有一个MongoDB版本3.0.3集合,其中包含具有2个字段的文档:
我在数组上构建了一个多键索引,并通过使用getIndexInfo()
方法确认该索引存在并且是多键的。但是,当我查询数组中特定字段的2个范围的交集时,Mongo不使用此索引,尽管集合中有1,000,000个文档。我可以从解释()
方法的输出中看到这一点。更奇怪的是,当我使用提示
指定索引时,Mongo遍历了所有1,000,000个文档和60,000,000个索引条目,我在解释()
的输出中看到了这些。
我正在使用以下代码构造查询:
BasicDBObject q2 = new BasicDBObject("array.0",new BasicDBObject("$lt",1000.0));
BasicDBObject q1 = new BasicDBObject("array.1",new BasicDBObject("$gte",800.0));
BasicDBObject q_and = new BasicDBObject("$and",Arrays.asList(q1,q2));
dbo = collection.find(q_and).explain();
有什么想法吗?
提前感谢您的帮助。
针对解释输出请求:
在不指定提示的情况下,解释输出如下:
{ "queryPlanner" :
{ "plannerVersion" : 1 , "namespace" : "local.TestArrays" , "indexFilterSet" : false , "parsedQuery" :
{ "$and" : [
{ "array.0" :
{ "$lt" : 1000.0
}
} ,
{ "array.1" :
{ "$gte" : 800.0
}
}]
} , "winningPlan" :
{ "stage" : "COLLSCAN" , "filter" :
{ "$and" : [
{ "array.0" :
{ "$lt" : 1000.0
}
} ,
{ "array.1" :
{ "$gte" : 800.0
}
}]
} , "direction" : "forward"
} , "rejectedPlans" : [ ]
} , "executionStats" :
{ "executionSuccess" : true , "nReturned" : 2 , "executionTimeMillis" : 2248 , "totalKeysExamined" : 0 , "totalDocsExamined" : 1000000 , "executionStages" :
{ "stage" : "COLLSCAN" , "filter" :
{ "$and" : [
{ "array.0" :
{ "$lt" : 1000.0
}
} ,
{ "array.1" :
{ "$gte" : 800.0
}
}]
} , "nReturned" : 2 , "executionTimeMillisEstimate" : 2190 , "works" : 1000002 , "advanced" : 2 , "needTime" : 999999 , "needFetch" : 0 , "saveState" : 7812 , "restoreState" : 7812 , "isEOF" : 1 , "invalidates" : 0 , "direction" : "forward" , "docsExamined" : 1000000
} , "allPlansExecution" : [ ]
} , "serverInfo" :
{ "host" : "NYDEVWS0005052" , "port" : 27017 , "version" : "3.0.3" , "gitVersion" : "b40106b36eecd1b4407eb1ad1af6bc60593c6105"
}
}
指定要与以下代码一起使用的索引时:
收集查找(q_和)。提示(“array_1”)。explain();
解释输出如下:
{ "queryPlanner" :
{ "plannerVersion" : 1 , "namespace" : "local.TestArrays" , "indexFilterSet" : false , "parsedQuery" :
{ "$and" : [
{ "array.0" :
{ "$lt" : 1000.0
}
} ,
{ "array.1" :
{ "$gte" : 800.0
}
}]
} , "winningPlan" :
{ "stage" : "KEEP_MUTATIONS" , "inputStage" :
{ "stage" : "FETCH" , "filter" :
{ "$and" : [
{ "array.0" :
{ "$lt" : 1000.0
}
} ,
{ "array.1" :
{ "$gte" : 800.0
}
}]
} , "inputStage" :
{ "stage" : "IXSCAN" , "keyPattern" :
{ "array" : 1
} , "indexName" : "array_1" , "isMultiKey" : true , "direction" : "forward" , "indexBounds" :
{ "array" : [ "[MinKey, MaxKey]"]
}
}
}
} , "rejectedPlans" : [ ]
} , "executionStats" :
{ "executionSuccess" : true , "nReturned" : 2 , "executionTimeMillis" : 61401 , "totalKeysExamined" : 60000000 , "totalDocsExamined" : 1000000 , "executionStages" :
{ "stage" : "KEEP_MUTATIONS" , "nReturned" : 2 , "executionTimeMillisEstimate" : 56570 , "works" : 60001744 , "advanced" : 2 , "needTime" : 59999998 , "needFetch" : 1743 , "saveState" : 470130 , "restoreState" : 470130 , "isEOF" : 1 , "invalidates" : 0 , "inputStage" :
{ "stage" : "FETCH" , "filter" :
{ "$and" : [
{ "array.0" :
{ "$lt" : 1000.0
}
} ,
{ "array.1" :
{ "$gte" : 800.0
}
}]
} , "nReturned" : 2 , "executionTimeMillisEstimate" : 55620 , "works" : 60001744 , "advanced" : 2 , "needTime" : 59999998 , "needFetch" : 1743 , "saveState" : 470130 , "restoreState" : 470130 , "isEOF" : 1 , "invalidates" : 0 , "docsExamined" : 1000000 , "alreadyHasObj" : 0 , "inputStage" :
{ "stage" : "IXSCAN" , "nReturned" : 1000000 , "executionTimeMillisEstimate" : 50820 , "works" : 60000000 , "advanced" : 1000000 , "needTime" : 59000000 , "needFetch" : 0 , "saveState" : 470130 , "restoreState" : 470130 , "isEOF" : 1 , "invalidates" : 0 , "keyPattern" :
{ "array" : 1
} , "indexName" : "array_1" , "isMultiKey" : true , "direction" : "forward" , "indexBounds" :
{ "array" : [ "[MinKey, MaxKey]"]
} , "keysExamined" : 60000000 , "dupsTested" : 60000000 , "dupsDropped" : 59000000 , "seenInvalidated" : 0 , "matchTested" : 0
}
}
} , "allPlansExecution" : [ ]
} , "serverInfo" :
{ "host" : "NYDEVWS0005052" , "port" : 27017 , "version" : "3.0.3" , "gitVersion" : "b40106b36eecd1b4407eb1ad1af6bc60593c6105"
}
}
恐怕您的问题是您正在查询数组的特定元素。因此,即使在该数组上有索引,查询也必须显式扫描整个集合,从数组中提取元素0和1,并执行匹配。
如果您需要在特定元素上完全运行匹配,那么值得将它们从数组中提取出来并将它们作为单独的字段,然后在它们上创建索引。所以考虑一下:
{
...
array: [...],
ex_element_0: "value0",
ex_element_1: "value0",
...
}
我误解了多键索引的含义。我以为为数组中的每个位置创建了一个单独的索引。但是,在进一步阅读后,我看到为数组创建了一个SINGLE索引,并且文档的所有条目都输入到该单个索引中,而不是保留数组位置。我接受了n9code的建议,在每个字段上创建了单独的字段和索引。这符合预期。
我的集合中有两个数组(一个是嵌入式文档,另一个只是字符串的简单集合)。文档,例如: 由于一些查询将仅包含策略,而一些查询将包含标签和参与者数组,并且考虑到我无法创建具有两个数组的多键索引这一事实,我认为使用索引交叉点将是一个经典场景。 我正在执行一个查询,但我看不到交叉点。 以下是索引: 以下是查询: 这是解释的结果: 查询中的每个标记(tag1、tag-2和tag-3)都有10K个文档。每个策略
我在MongoDB有一个收藏,里面有以下文档。 现在,我尝试使用以下查询查询一些文档。 根据我的理解,由于\u id是一个复合字段,并且Mongo总是在\u id上维护一个索引,因此要回答上述查询,Mongo应该在“\u id”上使用索引。然而,上述问题的答案如下: 可以观察到,MongoDB正在对DB进行一次完整的扫描,以查找少量文档。我不知道这里到底怎么了。 我试图改变查询的顺序,但结果相同。
MongoDB不使用索引-可能的排序问题? 我们有一个完全索引的MongoDB查询,最多可以扫描4/5行。然而,查询似乎只使用索引的一个元素(整数),而忽略了字符串部分。 我们使用的是不区分大小写的排序规则(强度=2),但指定与否没有任何区别。文档:https://docs.mongodb.com/manual/core/index-case-insensitive/ 排序规则是否使用索引?有没有
主要内容:额外开销,RAM 使用,查询限制,索引键限制,插入超过索引键限制的文档,最大范围本节我们来介绍以下使用索引时的一些限制和注意事项。 额外开销 每个索引都会占用一些空间,并且在每次执行插入、更新和删除等操作时也需要对索引进行操作,导致额外的开销。因此,如果您很少将某个集合用于读取操作,最好不要在集合中使用索引。 RAM 使用 由于索引存储在 RAM(内存)中,因此应确保索引的总大小不超过 RAM 的限制。如果总大小大于 RAM 的大小,那么 MongoDB 将删除一些索引,这就
问题内容: 我的数据库中有三个表: 这些表中的每个表都有两个字段,分别称为“内容”和“标题”。我希望能够在我的sql语句中使用“赞”来查看“ messages.content”,“ messages.title”,“ topics.content”,“ topics.title”,“ comments.content”和“ comments”。标题”使用关键字。 到目前为止,我的查询仅能从一张表中
问题内容: 经过搜索,没有找到这个特定的菜鸟问题的答案。如果我错过了,我深表歉意。 在MySQL数据库中,我有一个带有以下主键的表 主键ID(发票,项目) 在我的应用程序中,我也会经常自己选择“项目”,而很少选择“发票”。我假设我将从这些列的索引中受益。 当我定义以下内容时,MySQL不会抱怨: 索引(发票),索引(项目),主键ID(发票,项目) 但是,我没有看到任何证据(使用DESCRIBE-我