3

質問:tsフィールド: (タイムスタンプ) によってインデックス付けされた非常に大きなコレクションがあります。

> db.events.ensureIndex({'ts': -1})

最後の 5 つのエントリを取得したい。私が驚いたのは、クエリがインデックスを使用していないため、非常に遅いことです。

> db.events.find().sort({'ts': -1, '_id': -1}).limit(5)

ただし、または他のフィールドだけでソートすると、ts必要に応じてインデックスが使用されます。

> db.events.find().sort({'ts': -1}).limit(5)
> db.events.find().sort({'_id': -1}).limit(5)

これは MongoDB のバグですか、これは実際に文書化された機能ですか、それとも何か間違っていますか?

追加情報:

> db.events.find().sort({'ts': -1, '_id': -1}).limit(5).explain()
{
    "cursor" : "BasicCursor",
    "nscanned" : 795609,
    "nscannedObjects" : 795609,
    "n" : 5,
    "scanAndOrder" : true,
    "millis" : 22866,
    "nYields" : 73,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {

    }
}
> db.events.find().sort({'ts': -1}).limit(5).explain()
{
    "cursor" : "BtreeCursor ts_-1",
    "nscanned" : 5,
    "nscannedObjects" : 5,
    "n" : 5,
    "millis" : 0,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {
            "ts" : [
                    [
                            {
                                    "$maxElement" : 1
                            },
                            {
                                    "$minElement" : 1
                            }
                    ]
            ]
    }
}
4

1 に答える 1

5

Indexing Advice & FAQ wiki ページのIndexing Strategiesセクションを読む価値があります。

見落としている可能性のある考慮事項がいくつかあります。

  • MongoDB はクエリごとに 1 つのインデックスのみを使用します

  • 使用するsort列は、インデックスの最後の列でなければなりません

したがって、あなたの例では、 and に複合インデックスを追加する必要がtsあります_id:

db.events.ensureIndex({'ts':-1, '_id':-1});

..そしてexplain()、ソートが予想されるインデックスを使用していることを確認します。

> db.events.find().sort({'ts': -1, '_id':-1}).limit(5).explain()
{
    "cursor" : "BtreeCursor ts_-1__id_-1",
    "nscanned" : 5,
    "nscannedObjects" : 5,
    "n" : 5,
    "millis" : 0,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {
        "ts" : [
            [
                {
                    "$maxElement" : 1
                },
                {
                    "$minElement" : 1
                }
            ]
        ],
        "_id" : [
            [
                {
                    "$maxElement" : 1
                },
                {
                    "$minElement" : 1
                }
            ]
        ]
    }
}
于 2012-08-22T12:23:21.197 に答える