摘要:场景当数据两足够大的时候,一页展示不完的时候,我们经常会需要分页的功能。方案三,数据比较大,排序需要排序当数据量比较大的时候,并且需要排序的时候,可以使用这种情况。
场景
当数据两足够大的时候,一页展示不完的时候,我们经常会需要分页的功能。
方案 方案一,数据不是很大需要排序
</>复制代码
s := globalS.Copy()
c := s.DB(db).C(collection)
defer s.Close()
return c.Find(query).Select(selector).Sort(sort).Skip(100).Limit(20).All(result)
这中情况只适用于数据量比较小的时候,当数据量达到一定量,sort会内存益处报错
方案二,数据比较大不需要排序
</>复制代码
s := globalS.Copy()
c := s.DB(db).C(collection)
defer s.Close()
return c.Find(query).Select(selector).Skip(100).Limit(20).All(result)
当数据量比较大的时候,可以使用这种情况。如果需要排序,那就取得返回值后在排序。
方案三,数据比较大,排序需要排序
</>复制代码
var result []interface{}
s := globalS.Copy()
c := s.DB(db).C(collection)
defer s.Close()
pipeM := []bson.M{
{"$match": bson.M{"status": "true"}},
{"$skip": start},
{"$limit": end},
{"$sort": bson.M{"height": -1}},
}
pipe := c.Pipe(pipeM)
err = pipe.All(&result)
当数据量比较大的时候,并且需要排序的时候,可以使用这种情况。因为在skip,limit和sort同时出现的时候,由于有优先级,需要无论顺序如何,都是先执行sort,在执行skip,最后执行limit,但是我们使用聚合,也就是mgo里面的pipeline,可以改变执行的先后顺序。
结束语上面的三种情况都不适用大量的数据,首先是skip的限制,有人建议边查询边排序,我没有尝试
如果数据量过大,我建议使用分库分表的方式来完成,这样加上GO语言的多线程,可以很快的查询和聚合
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/19568.html
摘要:分页正反偏移数据库自带的和的限制条件为我们创建了分页的查询方式,但是如果利用不对,性能会出现千倍万倍差异。这两条是为查询最后一页的翻页查询用的。缓存和不精准数据量达到一定程度的时候,用户根本就不关心精准的总数没人关心差几个。 软件开发中,常用要用到分页、计算总数,数据量超过千万、上亿的时候,往往count 的需要超过 1s 的执行时间,甚至 3-5s,对于一个追求性能的前沿团队来说,这...
阅读 1475·2021-11-15 18:11
阅读 2641·2021-08-19 10:56
阅读 748·2021-08-09 13:42
阅读 898·2019-08-30 15:53
阅读 2161·2019-08-30 10:55
阅读 3241·2019-08-29 17:18
阅读 1532·2019-08-29 13:45
阅读 636·2019-08-29 13:15
极致性价比!云服务器续费无忧!
Tesla A100/A800、Tesla V100S等多种GPU云主机特惠2折起,不限台数,续费同价。
NVIDIA RTX 40系,高性价比推理显卡,满足AI应用场景需要。
乌兰察布+上海青浦,满足东推西训AI场景需要