摘要:場景當數(shù)據(jù)兩足夠大的時候,一頁展示不完的時候,我們經(jīng)常會需要分頁的功能。方案三,數(shù)據(jù)比較大,排序需要排序當數(shù)據(jù)量比較大的時候,并且需要排序的時候,可以使用這種情況。
場景
當數(shù)據(jù)兩足夠大的時候,一頁展示不完的時候,我們經(jīng)常會需要分頁的功能。
方案 方案一,數(shù)據(jù)不是很大需要排序
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)
這中情況只適用于數(shù)據(jù)量比較小的時候,當數(shù)據(jù)量達到一定量,sort會內(nèi)存益處報錯
方案二,數(shù)據(jù)比較大不需要排序
s := globalS.Copy() c := s.DB(db).C(collection) defer s.Close() return c.Find(query).Select(selector).Skip(100).Limit(20).All(result)
當數(shù)據(jù)量比較大的時候,可以使用這種情況。如果需要排序,那就取得返回值后在排序。
方案三,數(shù)據(jù)比較大,排序需要排序
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)
當數(shù)據(jù)量比較大的時候,并且需要排序的時候,可以使用這種情況。因為在skip,limit和sort同時出現(xiàn)的時候,由于有優(yōu)先級,需要無論順序如何,都是先執(zhí)行sort,在執(zhí)行skip,最后執(zhí)行l(wèi)imit,但是我們使用聚合,也就是mgo里面的pipeline,可以改變執(zhí)行的先后順序。
結(jié)束語上面的三種情況都不適用大量的數(shù)據(jù),首先是skip的限制,有人建議邊查詢邊排序,我沒有嘗試
如果數(shù)據(jù)量過大,我建議使用分庫分表的方式來完成,這樣加上GO語言的多線程,可以很快的查詢和聚合
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/19568.html
摘要:分頁正反偏移數(shù)據(jù)庫自帶的和的限制條件為我們創(chuàng)建了分頁的查詢方式,但是如果利用不對,性能會出現(xiàn)千倍萬倍差異。這兩條是為查詢最后一頁的翻頁查詢用的。緩存和不精準數(shù)據(jù)量達到一定程度的時候,用戶根本就不關(guān)心精準的總數(shù)沒人關(guān)心差幾個。 軟件開發(fā)中,常用要用到分頁、計算總數(shù),數(shù)據(jù)量超過千萬、上億的時候,往往count 的需要超過 1s 的執(zhí)行時間,甚至 3-5s,對于一個追求性能的前沿團隊來說,這...
閱讀 1382·2021-11-15 18:11
閱讀 2512·2021-08-19 10:56
閱讀 677·2021-08-09 13:42
閱讀 793·2019-08-30 15:53
閱讀 2086·2019-08-30 10:55
閱讀 3142·2019-08-29 17:18
閱讀 1435·2019-08-29 13:45
閱讀 545·2019-08-29 13:15