采用Seek Method加速分頁(yè)

凡事做過(guò)頁(yè)面的驮捍,一般對(duì)分頁(yè)不會(huì)陌生,也不會(huì)覺(jué)得它有多難:就是limit + offset的組合就可以了呀脚曾。但是东且,危險(xiǎn)往往都是從最不起眼的地方開(kāi)始的。在這里本讥,我先說(shuō)一下我之前在用MongoDB時(shí)遇到的問(wèn)題苇倡。這類問(wèn)題同樣會(huì)出現(xiàn)在這種分頁(yè)方式上。

當(dāng)時(shí)囤踩,我需要對(duì)于MongoDB中的數(shù)據(jù)進(jìn)行處理旨椒,每次處理一批,也相當(dāng)于是按頁(yè)來(lái)操作數(shù)據(jù)啦堵漱。這個(gè)沒(méi)啥難度综慎,直接使用API中的find + skip + limit就可以輕易搞定。迅速把程序?qū)懲曛缶烷_(kāi)始拿產(chǎn)品庫(kù)開(kāi)搞了勤庐。剛開(kāi)始一切正常示惊,可過(guò)了沒(méi)多久,就發(fā)現(xiàn)整個(gè)程序的性能下降了愉镰。進(jìn)入Mongo一查米罚,發(fā)現(xiàn)是Table Scan。哇丈探,那個(gè)collection中有上千萬(wàn)的數(shù)據(jù)奥荚瘛!

此處略去3000字碗降。

總之隘竭,問(wèn)題最后解決了,程序又運(yùn)行如飛讼渊。而解決之道很簡(jiǎn)單:只用find + limit动看,不再使用skip(原因自己想)。只不過(guò)在find中加了一個(gè)條件:上一批的最后一個(gè)document的_id爪幻。整個(gè)代碼形似(groovy代碼):


if (docId) {
    batch = collection.find(['_id': ['$gt': docId]] as Document).limit(BATCH_SIZE)
} else {
    batch = collection.find().limit(BATCH_SIZE)
}
docId = batch[-1]['_id']

它的原理很簡(jiǎn)單菱皆,其實(shí)就是利用可以利用的index來(lái)加速分頁(yè)须误。這種思想跟今天看到的文章的思路如出一轍,不再使用offset仇轻,尋找能達(dá)到同樣效果的index京痢,用它來(lái)助力搜索。因此拯田,文中給出的方案跟上面的代碼類似:


SELECT ...
  FROM ...
 WHERE ...
   AND id < ?last_seen_id
 ORDER BY id DESC
 FETCH FIRST 10 ROWS ONLY

這種分頁(yè)方式被稱為“seek method”历造,其中的id被稱為“seek predicate”甩十。典型的seek predicate還可以是日期船庇。需要提醒的是,seek predicate上需要有index才有意義侣监,而且它可以有多列鸭轮!采用這種方式的分頁(yè)可以避免上述分頁(yè)的潛在危險(xiǎn):當(dāng)頁(yè)數(shù)達(dá)到一定量之后,分頁(yè)速度會(huì)嚴(yán)重下降橄霉。

關(guān)于seek method窃爷,還可以參考下面的文章:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市姓蜂,隨后出現(xiàn)的幾起案子按厘,更是在濱河造成了極大的恐慌,老刑警劉巖钱慢,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逮京,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡束莫,警方通過(guò)查閱死者的電腦和手機(jī)懒棉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)览绿,“玉大人策严,你說(shuō)我怎么就攤上這事《銮茫” “怎么了妻导?”我有些...
    開(kāi)封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)怀各。 經(jīng)常有香客問(wèn)我栗竖,道長(zhǎng),這世上最難降的妖魔是什么渠啤? 我笑而不...
    開(kāi)封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任狐肢,我火速辦了婚禮,結(jié)果婚禮上沥曹,老公的妹妹穿的比我還像新娘份名。我一直安慰自己碟联,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布僵腺。 她就那樣靜靜地躺著鲤孵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辰如。 梳的紋絲不亂的頭發(fā)上普监,一...
    開(kāi)封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音琉兜,去河邊找鬼凯正。 笑死,一個(gè)胖子當(dāng)著我的面吹牛豌蟋,可吹牛的內(nèi)容都是我干的廊散。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼梧疲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼允睹!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起幌氮,我...
    開(kāi)封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缭受,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后该互,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體米者,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年慢洋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了塘雳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡普筹,死狀恐怖败明,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情太防,我是刑警寧澤妻顶,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站蜒车,受9級(jí)特大地震影響讳嘱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜酿愧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一沥潭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嬉挡,春花似錦钝鸽、人聲如沸汇恤。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)因谎。三九已至,卻和暖如春颜懊,著一層夾襖步出監(jiān)牢的瞬間财岔,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工河爹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留匠璧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓昌抠,卻偏偏與公主長(zhǎng)得像患朱,于是被迫代替她去往敵國(guó)和親鲁僚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子炊苫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)吁恍。 張土汪:刷leetcod...
    土汪閱讀 12,724評(píng)論 0 33
  • 配置 修改config/database.php在connection數(shù)組中添加mongodb的配置信息劣砍,如下 '...
    jooohnny閱讀 8,411評(píng)論 3 8
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理般卑,服務(wù)發(fā)現(xiàn)罩锐,斷路器廓啊,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • [TOC]未完更新中... 1. MongoDB安裝及配置 官網(wǎng)下載地址 安裝msc文件,現(xiàn)在3.4的版本,有了m...
    BigJeffWang閱讀 2,241評(píng)論 0 49
  • 初中畢業(yè)選高中那會(huì)兒当叭,有一個(gè)學(xué)校來(lái)拉生源。其中一位招生的老師對(duì)我們說(shuō)盖灸,只要你愿意來(lái)我們學(xué)校蚁鳖,學(xué)費(fèi)全免,每個(gè)月給補(bǔ)助...
    皆無(wú)罷了閱讀 541評(píng)論 5 2