使用正则表达式过滤器在MongoDB中进行Count()查询:性能低下

时间:2014-12-09 16:04:39

标签: regex performance mongodb

使用MongoDB 2.6.5

我有一组具有这种结构的文件:

{
  "_id" : ObjectId("5485cd0c6b0f96004220e414"),
  "exampleList" : [{
      "Value" : "uri:obj:id:1258477.479.129403280"
    },{
      "Value" : "uri:obj:id:1258477.542.542541247"
    }, {
      "Value" : "uri:obj:id:1258477.365.455255425"
    }
    [...]
    {
      "Value" : "uri:obj:id:1258477.147.855556255"
    }]
}

我在" exampleList.Value"上设置了一个多键索引。

我想要使用&#34类型的正则表达式来请求它;以"开头但根据正则表达式,它可能会很慢。正则表达式的修复部分更短(更多结果),处理速度更慢。

使用1亿份文档集进行演示" myCollection" :

最快的执行(立即):

> db.myCollection.count({"exampleList.Value":{$regex:/^uri:obj:id:1258477\.479\.129403280$/}})
156

快速执行(几秒钟):

> db.myCollection.count({"exampleList.Value":{$regex:/^uri:obj:id:1258477\.479\.129.*$/}})
502

执行速度较慢(几秒钟):

> db.myCollection.count({"exampleList.Value":{$regex:/^uri:obj:id:1258477\.479\.1.*$/}})
40947

执行缓慢(约2分钟)

> db.myCollection.count({"exampleList.Value":{$regex:/^uri:obj:id:1258477\.479.*$/}})
342275

非常非常懒散的执行(没有终止,几分钟)

> db.myCollection.count({"exampleList.Value":{$regex:/^uri:obj:id:1258477\.47.*$/}})

我不明白为什么在所有这些查询中治疗的时间都不一样。

1 个答案:

答案 0 :(得分:2)

第一个正则表达式很快完成,因为它只使用显式字符。

/^uri:obj:id:1258477\.479\.129403280$/

与使用贪婪的通配符'。*'的其他正则表达式相比。

/^uri:obj:id:1258477\.47.*$/

这包含字符串开头的最短确定字符集,超过数百万个文档可能有许多与第一部分匹配。

尝试更换'。*'具有绝对长度或范围,即'。{0,25}'。如果可用的话,用string.beginsWith方法替换它可能会更快。