使用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.*$/}})
我不明白为什么在所有这些查询中治疗的时间都不一样。
答案 0 :(得分:2)
第一个正则表达式很快完成,因为它只使用显式字符。
/^uri:obj:id:1258477\.479\.129403280$/
与使用贪婪的通配符'。*'的其他正则表达式相比。
/^uri:obj:id:1258477\.47.*$/
这包含字符串开头的最短确定字符集,超过数百万个文档可能有许多与第一部分匹配。
尝试更换'。*'具有绝对长度或范围,即'。{0,25}'。如果可用的话,用string.beginsWith方法替换它可能会更快。