採用Seek Method加速分頁

2021-09-17 02:43:31 字數 965 閱讀 6584

凡事做過頁面的,一般對分頁不會陌生,也不會覺得它有多難:就是limit + offset的組合就可以了呀。但是,危險往往都是從最不起眼的地方開始的。在這裡,我先說一下我之前在用mongodb時遇到的問題。這類問題同樣會出現在這種分頁方式上。

當時,我需要對於mongodb中的資料進行處理,每次處理一批,也相當於是按頁來運算元據啦。這個沒啥難度,直接使用api中的find + skip + limit就可以輕易搞定。迅速把程式寫完之後就開始拿產品庫開搞了。剛開始一切正常,可過了沒多久,就發現整個程式的效能下降了。進入mongo一查,發現是table scan。哇,那個collection中有上千萬的資料啊!

此處略去3000字。

總之,問題最後解決了,程式又執行如飛。而解決之道很簡單:只用find + limit,不再使用skip(原因自己想)。只不過在find中加了乙個條件:上一批的最後乙個document的_id。整個**形似(groovy**):

if (docid)  else 

docid = batch[-1]['_id']

它的原理很簡單,其實就是利用可以利用的index來加速分頁。這種思想跟今天看到的文章的思路如出一轍,不再使用offset,尋找能達到同樣效果的index,用它來助力搜尋。因此,文中給出的方案跟上面的**類似:

select ...

from ...

where ...

and id < ?last_seen_id

order by id desc

fetch first 10 rows only

這種分頁方式被稱為「seek method」,其中的id被稱為「seek predicate」。典型的seek predicate還可以是日期。需要提醒的是,seek predicate上需要有index才有意義,而且它可以有多列!採用這種方式的分頁可以避免上述分頁的潛在危險:當頁數達到一定量之後,分頁速度會嚴重下降。

何時採用SOA,何時不採用SOA

不可輕易決定實現soa。這與改變生活方式有些類似,因為開發和操作團隊遵循的 it 控制模式將完全不同。holt adams soa 能夠優化業務需求與 it 的一致性,能夠將業務流程活動從服務實現中分離出來,還能夠降低操作成本。只有在不固定 商的情況下才能真正實現這些功能,此時面向 soa 實現的技...

CAS採用http方式不採用https方式配置

cas3一下的版本網上介紹說比較複雜,本人未測試。本文是在cas server3.4版本上測試成功的,記錄在此以供以後查詢 主要有以下步驟 1.web inf spring configuration ticketgrantingticketcookiegenerator.xml中將p cookie...

UImageview加邊框 加陰影

uiimageview imgvphoto uiimageview alloc init 新增邊框 calayer layer imgvphoto layer layer.bordercolor uicolor whitecolor cgcolor layer.borderwidth 5.0f 新增...