2012-04-09 175 views
4

我有一个集合中有150万个文档,其索引为“name”字段。像db.things.find({name: /^foo/i})这样的查询大约需要5秒,这很慢。具有相同记录的相似MySQL表在少于10毫秒内执行SELECT * FROM things WHERE name LIKE 'foo%'MongoDB中缓慢的正则表达式查询

蒙戈的解释:

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 
      ] 
     ] 
    } 
} 

所以是正则表达式查询缓慢蒙戈还是我做错了?

回答

4

不区分大小写的正则表达式搜索会很慢,因为它不能有效地利用索引。如果只使用该字段进行搜索,则应考虑以全部小写形式存储文本,并使用区分大小写的正则表达式进行搜索。