如何在大型mongodb集合中有效地查询数据?

时间:2017-02-17 09:13:37

标签: mongodb mongodb-query

我有一个很大的mongodb集合(300万个文档,50个GigaBytes),即使我创建了索引,查询数据也会非常慢。

db.collection.find({"C123":1, "C122":2})

e.g。即使我为C123C122创建了单独的索引,查询也将超时或极端缓慢(至少10秒)。

我应该创建更多索引还是增加物理内存来加速查询?

4 个答案:

答案 0 :(得分:3)

对于这样的查询,您应该创建复合索引。一个在两个领域。然后它应该非常有效。创建单独的索引对你没有多大帮助,因为MongoDB引擎将首先使用获取查询的第一部分的结果,但是第二次使用if将无济于事(或者甚至可能因为查找而在某些情况下减慢查询速度索引表然后再在真实数据中)。您可以在shell中使用.explain()确认已使用的索引。

参见复合索引:

https://docs.mongodb.com/manual/core/index-compound/

还要考虑在制作索引时对两个字段进行排序。

答案 1 :(得分:1)

使用Dropboxval mapRdd = sc.textFile("inputFile.csv") .map { line => line.split(" ") } .flatMap { wordList => wordList.sliding(2) } .map { case Array(word1, word2) => ((word1, word2), 1) case Array(word1) => ((word1, ""), 1) } .reduceByKey(_ + _) println("===================================================") mapRdd.foreach { li => println(li._1.toString() + " ---> " + li._2) //println(li.sliding(2).foreach(li => println(li.toList))) } 。一次运行50000个数据的循环。

https://docs.mongodb.com/manual/reference/method/cursor.skip/

https://docs.mongodb.com/manual/reference/method/cursor.limit/ 例子:

skip

答案 2 :(得分:0)

答案很简单。

  1. 您不需要创建更多索引,您需要创建正确的索引。字段c124上的索引不会对字段c123上的查询提供帮助,因此无需创建它。

  2. 使用更好/更多硬件。更多RAM,更多机器(分片)。

答案 3 :(得分:0)

  • 创建Right索引并谨慎使用复合索引。 (每个集合最多可以有64个索引,复合索引中最多可以有31个字段)
  • 使用mongo分页
  • 尝试找出最常用的查询并围绕它建立复合索引。
  • 化合物的索引严格遵循顺序,因此请阅读文档并进行试验
  • 也可以尝试针对“摘要”之类的覆盖查询

努力学习。.