【发布时间】:2013-12-19 01:17:08
【问题描述】:
这个问题更新了一个更简单的解释。
对于我的数据,以下 Mongo CLI 查询需要 208 毫秒。此查询检索 18 个请求对象的所有数据。
db.videos.find({avg_rating: {$gt: 1}, poster_large_thumb: {$exists:true}, release_date: {$lte: ISODate("2000-12-31")}}).sort( {release_date:-1, avg_rating:-1, title:1}).skip(30).limit(18).pretty().explain()
{
"cursor" : "BasicCursor",
"nscanned" : 76112,
"nscannedObjects" : 76112,
"n" : 48,
"scanAndOrder" : true,
"millis" : 208,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
}
}
但是,当我进行查询时,使用 Mongoid 会创建一个没有实际数据的条件对象。我将此标准传递给一个方法,该方法对其进行迭代以创建 JSON 数据结构。由于需要数据,因此必须从数据库中检索每个对象。以下是返回查询的条件:
@videos = Video.order_by(release_date: -1, avg_rating: -1, title: 1).where(:avg_rating.gt => 1, :poster_large_thumb.exists => 1, :release_date.lte => start_date ).skip(skip*POSTERS_PER_ROW).limit(limit*POSTERS_PER_ROW)
当我迭代@videos 时,每个对象需要超过 240 毫秒才能从数据库中检索,这来自一些调试输出。
Getting one object:
2013-12-18 00:43:52 UTC
2013-12-18 00:43:52 UTC
0.24489331245422363
假设如果我在 Video.order_by(...) 查询中获取所有数据,总共需要 208 毫秒,我该如何强制它在一个查询中进行检索,而不是单独获取每个对象?
这里的某些东西导致整个检索比 Mongo CLI 多几个数量级。
【问题讨论】:
-
您的 mongod 日志将记录每一个耗时超过 100 毫秒的查询 - 您可以在那里看到它们的样子。