1. 程式人生 > 其它 >MongoDB海量資料分頁查詢優化

MongoDB海量資料分頁查詢優化

MongoDB海量資料分頁查詢優化

一、背景

大量資料需從Mongo拿出來,一次性拿出來不科學,傳統分頁效率低下

二、傳統方案

就是最常規的方案,假設 我們需要對文章 articles 這個表(集合) 進行分頁展示,一般前端會需要傳遞兩個引數:

– 頁碼(當前是第幾頁)
– 頁大小(每頁展示的資料個數)

skip 跳過的條目也會隨之變大,而這個操作是通過 cursor 的迭代器來實現的,對於cpu的消耗會比較明顯。

而當需要查詢的資料達到千萬級及以上時,會發現響應時間非常的長,可能會讓你幾乎無法接受!

或許,假如你的機器效能很差,在數十萬、百萬資料量時已經會出現瓶頸

三、改良做法

既然傳統的分頁方案會產生 skip 大量資料的問題,那麼能否避免呢?答案是可以的。
改良的做法為:

  1. 選取一個唯一有序的關鍵欄位,比如 _id,作為翻頁的排序欄位;
  2. 每次翻頁時以當前頁的最後一條資料_id值作為起點,將此併入查詢條件中。

四、效能測試

以10萬條資料為例

總頁數 傳統翻頁耗時(秒) ID翻頁耗時(秒)
100 0.18 0.09
500 3.01 0.33
1000 11.12 0.89
3000 93.58 2.60

可見,當頁數越大(資料量越大)時,改良的翻頁效果提升越明顯!

這種分頁方案其實採用的就是時間軸(TImeLine)的模式,實際應用場景也非常的廣

而同時除了上述的資料庫之外,HBase、ElastiSearch 在Range Query的實現上也支援這種模式。

五、完美分頁

時間軸(TimeLine)的模式通常是做成“載入更多”、上下翻頁這樣的形式,但無法自由的選擇某個頁碼。
那麼為了實現頁碼分頁,同時也避免傳統方案帶來的 skip 效能問題,我們可以採取一種折中的方案。