MongoDB,带有猫鼬的NodeJ。我有一个拥有750万个文档的大型数据库。有一个url
字段和一个索引{ url: 1 }
。
我的第一个查询是:
Scheme.find({ url: { $regex: "^google\.com.*" } }).limit(50).sort({ _id: -1 }).exec()
(the url values go without http/https, so it is a check for a values starts-with)
执行大约需要0.04秒。
好吧,走得更远:现在搜索类似的内容
{ $regex: "^.*google\.com.*" }
花了105秒的时间,因为正则表达式中字符串的开头是.*
并且索引没有帮助。
好的,没关系。
但是问题是:
现在我重复第一个查询(^google\.com.*
),搜索过程需要40-50秒
然后我重新启动mongod,它又花费了不到0.1秒的时间
找不到这种行为的原因:(
也这样做
Scheme.find({ url: { $regex: "^google\.com.*" } }).limit(50).sort({ _id: -1 }).explain()
慢速查询和快速查询的结果没有区别,只是在result[0].executionStats.executionTimeMillis
中:1表示快速,15表示慢速
P.S。 第一次查询快速传递后的serverStatus:https://gist.github.com/crystalbit/4e7919ddd822c0fbbf2dfc2bbad7195b
第二次查询后的serverStatus(可能会比较慢):https://gist.github.com/crystalbit/6a3687784a6f982e3459bc400f2d26fb
第三次查询后的serverStatus(第一个查询的副本,预计会很快,但是很慢):https://gist.github.com/crystalbit/aff0381bf6b3f9ed35674ecb9f3ca1a1
答案 0 :(得分:0)
许多数据库尝试缓存频繁查询或频繁访问的数据集。当然,由于高速缓存是有限的并且可能被新数据覆盖,因此这种“自适应性”导致相同查询的时序不同。 在某些数据库中,您对过程的控制更多,而在某些方面则更少。 MongoDB提供了一些控制,但是看起来它更多地依赖于OS缓存。 FAQ: MongoDB Fundamental
这里是显式缓存的示例(请参阅“获取类别”部分)。 Refactoring Tornado Code With gen.engine