gpt4 book ai didi

regex - 带有索引字段的 MongoDB 正则表达式

转载 作者:IT老高 更新时间:2023-10-28 13:04:48 26 4
gpt4 key购买 nike

我正在使用 MongoDB 创建我的第一个应用程序。为字段创建索引,并尝试使用 $regex 参数进行查找查询,在 shell 中启动

> 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,
"n" : 10,
"millis" : 531,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {

}
}

显然,在没有正则表达式的情况下搜索具有索引的字段工作得更快(即搜索具有常量字段的文档),但我真的对这种行为的原因很感兴趣。

最佳答案

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

当您删除索引时,您只是在进行表扫描并匹配那里的正则表达式 - 从本质上讲,您稍微简化了第一个操作。

如果它是 covered index query,您也许可以使索引版本更快。 ,如果这是一个复合索引并且您需要将它与另一个字段的条件结合起来,它也可能会更快。

当您使用前缀查询时,并不是它只使用索引,而是您有效地使用了索引,这是关键,因此您会看到真正的性能提升。

关于regex - 带有索引字段的 MongoDB 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8107102/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com