【问题标题】:MongoDB - too much data for sort() with no index errorMongoDB - sort() 数据过多,没有索引错误
【发布时间】:2011-05-22 21:27:35
【问题描述】:

我正在使用 MongoDB 1.6.3 来存储一个大集合(30 万多条记录)。我添加了一个复合索引。

db['collection_name'].getIndexes()
[
    {
        "name" : "_id_",
        "ns" : "db_name.event_logs",
        "key" : {
            "_id" : 1
        }
    },
    {
        "key" : {
            "updated_at.t" : -1,
            "community_id" : 1
        },
        "ns" : "db_name.event_logs",
        "background" : true,
        "name" : "updated_at.t_-1_community_id_1"
    }
]

但是,当我尝试运行此代码时:

db['collection_name']
  .find({:community_id => 1})
  .sort(['updated_at.t', -1])
  .skip(@skip)
  .limit(@limit)

我得到:

Mongo::OperationFailure(数据过多 对于没有索引的 sort()。添加一个 索引或指定更小的限制)

我做错了什么?

【问题讨论】:

    标签: mongodb database-design mongodb-indexes mongodb-ruby nosql


    【解决方案1】:

    即使有索引,我认为如果您的结果集超过 4MB,您仍然会收到该错误。

    您可以通过进入 mongodb 控制台并执行以下操作来查看大小:

    show dbs
    # pick yours (e.g., production)
    use db-production
    db.articles.stats()
    

    我最终得到了这样的结果:

    {
    "ns" : "mdalert-production.encounters",
    "count" : 89077,
    "size" : 62974416,
    "avgObjSize" : 706.9660630690302,
    "storageSize" : 85170176,
    "numExtents" : 8,
    "nindexes" : 6,
    "lastExtentSize" : 25819648,
    "paddingFactor" : 1,
    "flags" : 1,
    "totalIndexSize" : 18808832,
    "indexSizes" : {
        "_id_" : 3719168,
        "patient_num_1" : 3440640,
        "msg_timestamp_1" : 2981888,
        "practice_id_1" : 2342912,
        "patient_id_1" : 3342336,
        "msg_timestamp_-1" : 2981888
    },
    "ok" : 1
    }
    

    【讨论】:

    • 不是 db.articles.stats() 吗?
    【解决方案2】:

    游标批处理大小过大会导致此错误。设置批量大小不会限制您可以处理的数据量,它只是限制从数据库带回的数据量。当您迭代并达到批处理限制时,该过程将再次访问数据库。

    【讨论】:

      【解决方案3】:

      所以它“感觉”就像您在使用索引,但索引实际上是一个复合索引。我不确定排序是否“足够智能”以仅使用部分索引。

      所以有两个问题:

      1. 根据您的查询,我会将 community_id 作为索引的第一部分,而不是第二部分。 updated_at.t 听起来像是您将在其上进行范围查询的字段。如果范围查询是第二位,则索引会更好地工作。
      2. 将从community_id => 1 返回多少条目?如果数量不大,您可以不使用索引进行排序。

      因此您可能需要切换索引,并且可能需要更改排序以同时使用community_idupdated_at.t。我知道这似乎是多余的,但如果仍然无法正常工作,请从那里开始检查 Google 网上论坛。

      【讨论】:

        【解决方案4】:

        尝试添加{community_id: 1, 'updated_at.t': -1} 索引。需要先搜索community_id再排序。

        【讨论】:

        猜你喜欢
        • 2013-07-14
        • 2013-11-18
        • 2014-01-11
        • 2013-06-09
        • 2015-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-26
        相关资源
        最近更新 更多