2012-04-09 16 views
4

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

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

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