5

インデックス付きの「名前」フィールドを持つコレクションに 150 万のドキュメントがあります。クエリのようなものdb.things.find({name: /^foo/i})は約 5 秒かかり、非常に遅いです。同じレコードを持つ同様の MySQL テーブルは、SELECT * FROM things WHERE name LIKE 'foo%'10 ミリ秒未満で実行されます。

モンゴの説明:

db.things.find({name: /^foo/i}).limit(10).explain()
{
    "cursor" : "BtreeCursor name_1 multi",
    "nscanned" : 325730,
    "nscannedObjects" : 10,
    "n" : 10,
    "millis" : 4758,
    "nYields" : 89,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {
        "name" : [
            [
                "",
                {

                }
            ],
            [
                /^foo/i,
                /^foo/i
            ]
        ]
    }
}

それで、mongo遅い正規表現クエリですか、それとも間違っていますか?

4

1 に答える 1

4

大文字と小文字を区別しない正規表現検索は、インデックスを効果的に利用できないため遅くなります。フィールドを検索のみに使用する場合は、テキストをすべて小文字で保存し、大文字と小文字を区別する正規表現で検索することを検討してください。

于 2012-04-10T03:38:10.693 に答える