MongoDB中的慢速regexp查询

tyc*_*oon 5 regex mongodb

我在一个带有索引"名称"字段的集合中有150万个文档.查询db.things.find({name: /^foo/i})大约需要5秒,这非常慢.具有相同记录的类似MySQL表SELECT * FROM things WHERE name LIKE 'foo%'在不到10毫秒内执行.

mongo的解释:

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
            ]
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

那么,正则表达式查询在蒙戈慢还是我做错了?

Nat*_*Nat 4

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