我用MongoDB创建了我的第一个apply.

> 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,你可能会使索引版本更快,如果这是一个复合索引,你可能也会更快,你需要将它与另一个字段的标准结合起来.

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

Mongodb相关问答推荐

MongoDB:子文档中仅存在于父文档中的返回字段?

MongoDB:从集合页面数据中提取不同的值

MongoDB合并按键更新值的对象数组

如何向所有文档添加一个字段,其中前 100 个文档的值为 1,接下来的 100 个文档的值为 2,依此类推?

构造函数的参数 0 需要错误类型的 bean

mongo shell 命令不接受使用 db 命令

MongoDB 存储大量指标/分析数据的方法

Mongoose 架构引用和未定义类型ObjectID

在一个变量上运行的 Node JS 中使用正则表达式的 Mongo 查询

Java MongoDB FindOne 获取最后插入的记录

如何在 $lookup Mongodb 的 LocalField 中将字符串转换为 objectId

字段类型在 MongoDB 索引中是否重要?

如何在 Node.js 中格式化 Mongoose 的日期?

使用 Java 驱动程序更新 MongoDB 中的数组

用于嵌入式集合的 MongoDB 首选模式.文档与数组

通过浏览器连接mongodb?

将新值推送到 mongodb 内部数组 - mongodb/php

spring 数据MongoDB.生成id的错误

mongoose中的 Date.now() 和 Date.now 有什么区别?

mongoose — 判断 ObjectId 是否存在于数组中