我有一个很大的mongodb集合(300万个文档,50个GigaBytes),即使我创建了索引,查询数据也会非常慢。
db.collection.find({"C123":1, "C122":2})
e.g。即使我为C123
和C122
创建了单独的索引,查询也将超时或极端缓慢(至少10秒)。
我应该创建更多索引还是增加物理内存来加速查询?
答案 0 :(得分:3)
对于这样的查询,您应该创建复合索引。一个在两个领域。然后它应该非常有效。创建单独的索引对你没有多大帮助,因为MongoDB引擎将首先使用获取查询的第一部分的结果,但是第二次使用if将无济于事(或者甚至可能因为查找而在某些情况下减慢查询速度索引表然后再在真实数据中)。您可以在shell中使用.explain()确认已使用的索引。
参见复合索引:
https://docs.mongodb.com/manual/core/index-compound/
还要考虑在制作索引时对两个字段进行排序。
答案 1 :(得分:1)
使用Dropbox
和val 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)
答案很简单。
您不需要创建更多索引,您需要创建正确的索引。字段c124
上的索引不会对字段c123
上的查询提供帮助,因此无需创建它。
使用更好/更多硬件。更多RAM,更多机器(分片)。
答案 3 :(得分:0)
努力学习。.