我的文件看起来像这样:
{
{
"_id": ObjectId("5444fc67931f8b040eeca671"),
"meta": {
"SessionID": "45",
"configVersion": "1",
"DeviceID": "55",
"parentObjectID": "55",
"nodeClass": "79",
"dnProperty": "16"
},
"cfg": {
"Name": "test"
}
}
名称和数据仅用于测试atm。但我在DB中总共有2500万个文档。我正在使用find()来获取此find()中的特定文档。在这种情况下我使用四个参数,dnProperty,nodeClass,DeviceID和configVersion它们都不是唯一的。
大气压。我的索引设置简单如下:
ensureIndex([["nodeClass", 1],["DeviceID", 1],["configVersion", 1], ["dnProperty",1]])
换句话说,我有四个参数的索引。如果您进行的搜索根本找不到任何文档,我仍然会遇到很大的问题。在我的例子中,所有“数据”从1-100开始是随机的,所以如果我用其中一个值>做一个find()。 100然后它需要30-180秒来执行搜索,它也使用我所有的8GB RAM,然后由于没有RAM,计算机变得非常慢。
什么是更好的指数?我使用索引是否正确?我是否只需要更多的RAM,因为它会将“全部”数据库放入其工作内存中?你会推荐另一个DB(除了mongo)来更好地处理这个吗?
很抱歉有多个问题我希望它们足够短,你可以给我一个答案。
答案 0 :(得分:1)
MongoDB使用内存映射文件,这意味着数据和索引的副本存储在RAM中,只要有查询,它就会从RAM本身获取它。在当前场景中,您的查询速度较慢,因为您的数据+索引大小太大而无法容纳在RAM中,因此从磁盘获取数据会有很多I / O活动,这是瓶颈。
Sharding有助于解决这个问题,因为如果您对数据进行分区/分片,例如5台机器,那么您将拥有8GB * 5 = 40GB的RAM,它可以将您的(数据集+索引=工作集)保存在RAM本身和开销中I / O将减少,从而提高性能。
因此,在这种情况下,您的索引无法帮助提高性能超过某一点,您需要在多台计算机上对数据进行分片。分片将倾向于线性增加读取和写入吞吐量。 Sharding in MongoDB