不使用索引

时间:2017-02-08 09:50:51

标签: mongodb

我已经多次询问过这个问题,最终导致复合索引的订单问题,但我的问题有点简单。

我有一个包含250M +文档的非常大的数据库,我正在尝试清理一些旧文档,其中我们有一个包含时间戳的字符串字段。我试图使用正则表达式匹配/计算与当前格式不匹配的文档。

查询

{ "timestamp": { "$not" : /^[0-9]+-[0-9]+-[0-9]+ [0-9]+:[0-9]+:[0-9]+$/ } }

我在timestamp字段上有一个非复合索引。

索引

{
    "v" : 1,
    "key" : {
        "timestamp" : 1
    },
    "name" : "timestamp",
    "ns" : "weblogsdb.weblogsCol",
    "dropDups" : false,
    "background" : false
}

现在,我无法运行解释查询以获得更深入的外观,因为它本身也会运行数小时,但是从db.currentOps()调用,我可以看到它使用了COLLSCAN:

db.currentOp()

    {
        "opid": 121436812,
        "active": true,
        "secs_running": 27,
        "microsecs_running": NumberLong(27006658),
        "op": "query",
        "ns": "weblogsdb.weblogsCol",
        "query": {
            "count": "weblogsCol",
            "fields": {
                "timestamp": 1
            },
            "query": {
                "timestamp": {
                    "$not": /^[0-9]+-[0-9]+-[0-9]+ [0-9]+:[0-9]+:[0-9]+$/
                }
            }
        },
        "planSummary": "COLLSCAN",
        "client": "127.0.0.1:56796",
        "desc": "conn150511",
        "threadId": "0x7d5337d13700",
        "connectionId": 150511,
        "locks": {
            "^v5_live_weblogs": "R"
        },
        "waitingForLock": true,
        "numYields": 14655,
        "lockStats": {
            "timeLockedMicros": {
                "r": NumberLong(42127960),
                "w": NumberLong(0)
            },
            "timeAcquiringMicros": {
                "r": NumberLong(951332),
                "w": NumberLong(0)
            }
        }
    }

我已经检查了有关正则表达式匹配的MongoDB文档,并且它使用索引进行扫描,但是没有关于" $ not"的大量信息。运算符,以及它对查询的影响。

https://docs.mongodb.com/v2.2/reference/operator/query/regex/

对于我可以做些什么来提高查询性能的任何建议,以及对我出错的地方的解释都将不胜感激。

我使用旧版本的mongoDB(v2.6.12)可能没有任何价值

0 个答案:

没有答案