如果执行另一个慢速查询后重复执行,则原本具有索引的快速查询的速度会慢得多

时间:2019-03-25 15:57:07

标签: node.js mongodb mongoose

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

1 个答案:

答案 0 :(得分:0)

许多数据库尝试缓存频繁查询或频繁访问的数据集。当然,由于高速缓存是有限的并且可能被新数据覆盖,因此这种“自适应性”导致相同查询的时序不同。 在某些数据库中,您对过程的控制更多,而在某些方面则更少。 MongoDB提供了一些控制,但是看起来它更多地依赖于OS缓存。 FAQ: MongoDB Fundamental

这里是显式缓存的示例(请参阅“获取类别”部分)。 Refactoring Tornado Code With gen.engine