【问题标题】:Mongodb multi index search reduced performanceMongodb多索引搜索降低性能
【发布时间】:2015-03-04 15:56:56
【问题描述】:

我有一个关于索引查询性能下降的问题。我有一个由“COLOR”和“FLAVOR”两个字段索引的集合。该集合相当庞大,有 2700 万份文档。当我分别使用每个字段查询集合时,我得到了更快的回报

collection.find({'COLOR': 'BLUE'}).count()

collection.find({'FLAVOR': 'SWEET'}).count()

当我将这些字段组合成一个查询时,性能会大大降低。本质上,查询会无限期运行(无错误)。

collection.find({'COLOR': 'BLUE’},{'FLAVOR': 'SWEET'}).count()

任何想法为什么会发生这种情况?

【问题讨论】:

  • 你在这些字段上使用了单一索引还是复合索引?
  • 我使用了单个索引。
  • 在您的情况下,您必须定义一个复合索引 collection.createIndex({'COLOR': 1, 'FLAVOR' : 1})
  • 可能只是一个错字,但在您的组合查询中,您的语法实际上是查询 COLOR 为 BLUE 的文档,然后投影每个文档的 FLAVOR 字段,然后对其进行计数。您需要将两个字段放入一个对象中:collection.find({COLOR: 'BLUE', FLAVOR: 'SWEET'}).count()
  • 感谢 JohnnyHK。错字出现在我的翻译中,而不是工作代码。

标签: mongodb search indexing


【解决方案1】:

性能上的巨大差异可能是由于需要将文档从磁盘加载到内存中。假设您的组合查询编写不正确,并且您的意思是查询等同于

db.collection.count({ "COLOR" : "BLUE", "FLAVOR" : "SWEET" })

即计算COLOR"BLUE"FLAVOR"SWEET" 的文档数,MongoDB 将选择COLORFLAVOR 上的索引之一来帮助完成查询。将根据经验比较两者的表现来做出选择;选择哪个答案并不重要,因此我们将假设查询使用索引{ "COLOR" : 1 } 并与

db.collection.count({ "COLOR" : "BLUE" })

后面的查询只需要查看索引BTree节点中"COLOR" : "BLUE"的文档指针的数量。前一个查询将使用 BTree 查找 "COLOR" : "BLUE" 所在的文档,但随后必须加载每个文档并检查是否为 "FLAVOR" : "SWEET"FLAVOR 上的索引不能用于后面的操作,因为它从 FLAVOR 值映射到文档,而不是相反。

您看不到这种情况直接发生,因为 .count 返回一个整数,但是当您比较覆盖的查询时,情况几乎相同

db.collection.find({ "COLOR" : "BLUE" }, { "_id" : 0, "COLOR" : 1 })

用查询

db.collection.find({ "COLOR" : "BLUE", "FLAVOR" : "SWEET" }, { "_id" : 0, "COLOR" : 1 })

我建议使用.explain 尝试这两个查询,并比较nnscannednscannedObjects

如 cmets 中所述,您只需使用 { "COLOR" : 1, "FLAVOR" : 1 } 上的复合索引即可生成计数 db.collection.count({ "COLOR" : "BLUE", "FLAVOR" : "SWEET" })

【讨论】:

  • 感谢 wdberkeley。这个解释很清楚也很有帮助!
猜你喜欢
  • 1970-01-01
  • 2013-09-05
  • 2014-07-01
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
相关资源
最近更新 更多