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

前端之家收集整理的这篇文章主要介绍了正则表达式 – 具有索引字段的MongoDB正则表达式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用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,如果这是一个复合索引,并且您需要将其与另一个字段的标准相结合,它也可能会更快。

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

猜你在找的正则表达式相关文章