加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – 具有索引字段的MongoDB正则表达式

发布时间:2020-12-14 06:36:34 所属栏目:百科 来源:网络整理
导读:我正在使用MongoDB创建我的第一个应用程序。 创建一个字段的索引,并在shell中启动了一个$ regex param查找查询 db.foo.find({A:{$regex:'BLABLA!25500[0-9]'}}).explain(){ "cursor" : "BtreeCursor A_1 multi","nscanned" : 500001,"nscannedObjects" : 10
我正在使用MongoDB创建我的第一个应用程序。
创建一个字段的索引,并在shell中启动了一个$ regex param查找查询
> db.foo.find({A:{$regex:'BLABLA!25500[0-9]'}}).explain()
{
        "cursor" : "BtreeCursor A_1 multi","nscanned" : 500001,"nscannedObjects" : 10,"n" : 10,"millis" : 956,"nYields" : 0,"nChunkSkips" : 0,"isMultiKey" : false,"indexOnly" : false,"indexBounds" : {
                "A" : [
                        [
                                "",{

                                }
                        ],[
                                /BLABLA!25500[0-9]/,/BLABLA!25500[0-9]/
                        ]
                ]
        }
}

这是非常奇怪的,因为当我启动相同的查询,但没有收集索引,性能好多了。

> db.foo.find({A:{$regex:'BLABLA!25500[0-9]'}}).explain()
{
        "cursor" : "BasicCursor","nscanned" : 500002,"nscannedObjects" : 500002,"millis" : 531,"indexBounds" : {

        }
}

显然,搜索没有正则表达式的索引的字段的工作速度要快得多(即使用常量字段搜索文档),但是我真的对这种行为的原因感兴趣。

这里的性能差异的原因很可能是,在启用索引的情况下,您的查询必须遍历索引(加载到内存中),然后将匹配的文档加载到内存中。由于您没有使用前缀查询,索引中的所有值将根据正则表达式进行扫描和测试。不是很有效率。

当您删除索引时,您只是在进行表扫描并与正则表达式匹配 – 基本上您稍微简化了第一个。

您可能能够使索引版本更快,如果它是covered index query,如果这是一个复合索引,并且您需要将其与另一个字段的标准相结合,它也可能会更快。

当您使用前缀查询时,它不是仅使用索引,而是有效地使用索引,这是关键,因此您将看到实际的性能提升。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读