我已经多次询问过这个问题,最终导致复合索引的订单问题,但我的问题有点简单。
我有一个包含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)可能没有任何价值