正则表达式 – 具有索引字段的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,如果这是一个复合索引,并且您需要将其与另一个字段的标准相结合,它也可能会更快。 当您使用前缀查询时,它不是仅使用索引,而是有效地使用索引,这是关键,因此您将看到实际的性能提升。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |