首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Mongo驱动程序编写索引交集查询

问如何用Mongo驱动程序编写索引交集查询
EN

Stack Overflow用户
提问于 2014-09-18 15:33:24
回答 2查看 2.2K关注 0票数 1

我在googled上搜索并阅读了mongodb (http://docs.mongodb.org/manual/core/index-intersection/)的官方文档,但是没有发现任何关于使用索引交叉的查询语法的教程或指示。

当查询涉及由单个索引单独索引的两个字段时,mongodb是否自动应用索引交叉?我不这样认为。

当我在两个日期和给定的“名称”之间运行查询时,cursor.explain()显示了什么(“名称”是一个字段,日期和名称都是索引的)。

代码语言:javascript
复制
{
  "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驱动程序编写基本查询。如果能节省您的时间,只需发布基本的代码示例即可。

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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 :)

票数 4
EN

Stack Overflow用户

发布于 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) 通知数据库集合的索引字段,以提高性能。

如下所示,

代码语言:javascript
复制
List obj = collection.find( query ).hint(indexName);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25916864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档