我在googled上搜索并阅读了mongodb (http://docs.mongodb.org/manual/core/index-intersection/)的官方文档,但是没有发现任何关于使用索引交叉的查询语法的教程或指示。
当查询涉及由单个索引单独索引的两个字段时,mongodb是否自动应用索引交叉?我不这样认为。
当我在两个日期和给定的“名称”之间运行查询时,cursor.explain()显示了什么(“名称”是一个字段,日期和名称都是索引的)。
{
"cursor": "BtreeCursor Name_1",
"isMultiKey": false,
"n": 99330,
"nscannedObjects": 337500,
"nscanned": 337500,
"nscannedObjectsAllPlans": 337601,
"nscannedAllPlans": 337705,
"scanAndOrder": false,
"indexOnly": false,
"nYields": 18451,
"nChunkSkips":
"millis": 15430,
"indexBounds": {
"Name": [
[
"blabla",
"blabla"
]
]
},
"allPlans": [
{
"cursor": "BtreeCursor Name_1",
"isMultiKey": false,
"n": 99330,
"nscannedObjects": 337500,
"nscanned": 337500,
"scanAndOrder": false,
"indexOnly": false,
"nChunkSkips": 0,
"indexBounds": {
"Name": [
[
"blabla",
"blabla"
]
]
}
},
{
"cursor": "BtreeCursor Date_1",
"isMultiKey": false,
"n": 0,
"nscannedObjects": 101,
"nscanned": 102,
"scanAndOrder": false,
"indexOnly": false,
"nChunkSkips": 0,
"indexBounds": {
"Date": [
[
"2014-08-23 10:28:50.221",
"2014-08-23 13:28:50.221"
]
]
}
},
{
"cursor": "Complex Plan",
"n": 0,
"nscannedObjects": 0,
"nscanned": 103,
"nChunkSkips": 0
}这个复杂的计划什么也没有显示出来。经过的时间是16s。如果我只按名称查询,没有日期,则只需0.9s
我想学习如何在mongojava驱动程序中使用索引交集来编写查询,类似于mongojava中的提示()。欢迎任何示例或教程链接。
我知道如何使用Mongodb驱动程序编写基本查询。如果能节省您的时间,只需发布基本的代码示例即可。
提前谢谢。
发布于 2014-09-19 12:41:26
阅读这些链接后:http://docs.mongodb.org/manual/core/query-plans/#index-filters https://jira.mongodb.org/browse/SERVER-3071
我得出的结论是,目前没有办法强制查询使用索引交叉。
实际上,当一个查询可以使用多个候选索引时,mongodb并行运行它们,并等待一个索引来“赢得比赛”。胜利者索引是先完成整个查询或首先返回匹配结果的阈值数的索引。然后mongodb使用此索引进行查询。
如果查询非常不同,而且不能构建许多复合索引,那么它就死了。您只能信任mongodb的测试。
有时,一个指数比另一个指标更具选择性。但这并不意味着它返回的结果更快。和我的情况一样,“名称”索引更有选择性。它可能会提取较少的文件。但是,它需要一个日期比较,以确定获取的文档是否与整个查询匹配。另一方面,"date“索引从disque获取更多文档,但只对"name”字段执行简单的相等测试,以确定文档是否与查询匹配。这可能就是它能够通过测试的原因。
关于索引交集,它从未在我的几个查询测试中使用过。我怀疑它是否有用,并期望mongodb在未来的版本中改进其性能。
如果我的结论是错误的,请指出。还在学习MongoDB :)
发布于 2014-09-18 17:08:07
当查询涉及由单个索引单独索引的两个字段时,mongodb是否自动应用索引交叉?
已在此回答:MongoDB index intersection
您不能强迫MongoDB应用索引交叉,而是可以修改查询以允许MongoDB查询优化器在查询中应用index intersection策略。
若要了解查询参数如何影响索引过程,请参阅此链接,尽管它适用于复合索引。
http://java.dzone.com/articles/optimizing-mongodb-compound
Java提供了两种方法来在find()操作中使用提示():
MongoDB Java 公共DBCursor提示(字符串indexName) 公共DBCursor提示(DBObject indexKeys) 通知数据库集合的索引字段,以提高性能。
如下所示,
List obj = collection.find( query ).hint(indexName);https://stackoverflow.com/questions/25916864
复制相似问题