Mongodb索引获取太多数据以进行排序

时间:2013-12-28 03:56:23

标签: ruby-on-rails mongodb

好的,我找不到答案所以这是我的问题......

首先,我有一个普通的mongodb问题。我有一个单独的数据库服务器上有mongodb。我是否需要运行rake任务以在Rails应用服务器或数据库服务器上添加索引?

我一直收到错误“mongo sort for(没有索引)的数据太多。添加一个索引或指定一个更小的限制”

当我查看索引时,这就是我得到的:

{
    "v" : 1,
    "key" : {
        "_id" : 1
    },
    "ns" : "app.object_items",
    "name" : "_id_"
},
{
    "v" : 1,
    "key" : {
        "object_id" : 1
    },
    "ns" : "app.object_items",
    "name" : "object_id_1",
    "background" : true
}

我的关系是对象has_many object_items和object_items属于object。

导致数据错误太多的查询是:

@ object.object_items.where(included:false).sort_by(&:position).first(25)

@ object.object_items.count = 54所以我们这里不是在讨论很多数据。

这是我设置的索引的问题还是我错过了一些简单的东西?

提前致谢。

BR

1 个答案:

答案 0 :(得分:2)

  

导致数据错误太多的查询是:

     

@ object.object_items.where(included:false).sort_by(&:position).first(25)

根据您的索引列表,您缺少一个符合此条件的条件和排序顺序的索引。我认为,由于您的object has_many object_itemsobject_id正在添加where()条件,您还需要included上的索引最后是用于排序的position字段。

MongoDB(在2.4中)每个查询只使用一个索引,因此确保在object_items上进行最佳搜索(没有内存排序)的预期索引是:

{object_id:1, included:1, position:1}

你还没有提到你使用Rails的ODM框架(即Mongoid,MongoMapper,..),但应该有声明索引的规定..或者你可以通过{确保它是一次性的{1}} shell。

例如,在Mongoid中,您可以使用object_items类中的mongodefine an index

index
  

@ object.object_items.count = 54所以我们这里不是在讨论很多数据。

limit for an in-memory sort为32MB(至少对于MongoDB 2.2 / 2.4)。

在您的示例中,我认为index({object_id:1, included:1, position:1}) 计数具有误导性,因为只会包含与object.object_items匹配的object_items。实际生成的查询可能正在检查大量数据。

理解查询的更好方法是在该级别2的enable query profiling处捕获正在生成的实际查询,然后在object explain()生成的查询} shell。