MongoDB海量資料分頁查詢優化
阿新 • • 發佈:2022-12-06
MongoDB海量資料分頁查詢優化
一、背景
大量資料需從Mongo拿出來,一次性拿出來不科學,傳統分頁效率低下
二、傳統方案
就是最常規的方案,假設 我們需要對文章 articles 這個表(集合) 進行分頁展示,一般前端會需要傳遞兩個引數:
– 頁碼(當前是第幾頁)
– 頁大小(每頁展示的資料個數)
skip 跳過的條目也會隨之變大,而這個操作是通過 cursor 的迭代器來實現的,對於cpu的消耗會比較明顯。
而當需要查詢的資料達到千萬級及以上時,會發現響應時間非常的長,可能會讓你幾乎無法接受!
或許,假如你的機器效能很差,在數十萬、百萬資料量時已經會出現瓶頸
三、改良做法
既然傳統的分頁方案會產生 skip 大量資料的問題,那麼能否避免呢?答案是可以的。
改良的做法為:
- 選取一個唯一有序的關鍵欄位,比如 _id,作為翻頁的排序欄位;
- 每次翻頁時以當前頁的最後一條資料_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 效能問題,我們可以採取一種折中的方案。