我在使用Mongoid查询时遇到了性能问题,尤其是在生产环境中。 我最初认为这与主机有关(使用的是最小的Linode实例),但当我迁移到更大的实例后,查询速度略有改善。 以产品页面为例,在生产环境中加载需要大约800毫秒至1000毫秒的时间(在开发环境中为60毫秒),但在主机迁移后,它在生产环境中的速度大约在300毫秒至800毫秒之间。 这让我相信缓慢是由于低效的查询以及可能存在的n+1副作用引起的。 下面是我访问产品API时发生的情况快照:
MOPED: 173.255.252.208:27017 QUERY database=* collection=orders selector= {"$query"=>{"user_id"=>"52cc529eec5cb38bbf000001"}, "$orderby"=>{:_id=>1}} flags=[] limit=-1 skip=0 batch_size=nil fields=nil (20.6976ms)
MOPED: 173.255.252.208:27017 QUERY database=* collection=orders selector={"$query"=>{"user_id"=>"52cc529eec5cb38bbf000001"}, "$orderby"=>{:_id=>1}} flags=[] limit=-1 skip=0 batch_size=nil fields=nil (13.5436ms)
MOPED: 173.255.252.208:27017 COMMAND database=* command={:count=>"orders", :query=>{"user_id"=>"52cc529eec5cb38bbf000001"}} (18.1813ms)
MOPED: 173.255.252.208:27017 QUERY database=* collection=orders selector={"$query"=>{"user_id"=>"52cc529eec5cb38bbf000001"}, "$orderby"=>{:_id=>1}} flags=[] limit=-1 skip=0 batch_size=nil fields=nil (15.9233ms)
MOPED: 173.255.252.208:27017 QUERY database=* collection=orders selector={"$query"=>{"user_id"=>"52cc529eec5cb38bbf000001"}, "$orderby"=>{:_id=>1}} flags=[] limit=-1 skip=0 batch_size=nil fields=nil (29.9242ms)
MOPED: 173.255.252.208:27017 QUERY database=* collection=orders selector={"$query"=>{"user_id"=>"52cc529eec5cb38bbf000001"}, "$orderby"=>{:_id=>1}} flags=[] limit=0 skip=0 batch_size=nil fields=nil (69.3288ms)
看起来这是导致缓慢的主要原因,但是为什么查询订单集合会如此缓慢?下面是Mongodb的stats():
db.orders.stats()
{
"ns" : "orders",
"count" : 21535,
"size" : 15068736,
"avgObjSize" : 699.7323426979336,
"storageSize" : 23617536,
"numExtents" : 7,
"nindexes" : 3,
"lastExtentSize" : 9555968,
"paddingFactor" : 1.025000000000004,
"systemFlags" : 1,
"userFlags" : 0,
"totalIndexSize" : 5567856,
"indexSizes" : {
"_id_" : 711312,
"order_number_index" : 972944,
"_keywords_1" : 3883600
},
"ok" : 1
}
这个集合本身似乎相当小(22k条记录),所以查询为什么会如此缓慢令人困惑。正如您所看到的,我在集合上添加了索引,因此我不知道该如何提高查询速度。非常感谢您的帮助!谢谢!