mongodb大資料量分頁查詢效率問題
阿新 • • 發佈:2018-12-24
最常見的分頁採用的是skip+limit這種組合方式,這種方式對付小資料倒也可以,但是對付上幾百上千萬的大資料,只能力不從心,skip如果跳過大量的資料會很慢,並且會越查越慢。
//程式碼大概看下意思就行了
const list = db.getCollection('sent_logs').count({
field_1: 'wx5dacee99764a8af5'
}).skip(200).limit(10);
針對這一情況,可以通過條件查詢+排序+限制返回記錄,即 邊查詢,邊排序,排序之後,抽取上一頁中的最後一條記錄,作為當前分頁的查詢條件,從而避免了skip效率低下的問題。
db.getCollection('sent_logs').find({ field_1: 'wx5dacee99764a8af5', key1:{$gt: '#上一條記錄的排序值#'} }).limit(20)
不過在專案使用過程中,發現後面的資料基本沒有用,所以用了一個閹割版的辦法,如果條目數大於特定值 比如5000條,則只返回前5000條,否則返回全部,即只能檢視前5000條;
再想看更多結果的話 就得用縮小插敘範圍來解決了:
//程式碼大概看下意思就行了 const total_count = 5000; const list = db.getCollection('sent_logs').find({ field_1: 'wx5dacee99764a8af5' }).skip(5000).limit(1); if (list.length === 0) { total_count = db.getCollection('sent_logs').count({ field_1: 'wx5dacee99764a8af5' }) }
這個方法雖然多了一次資料庫查詢,但是對於幾十萬往上的查詢結果分頁來說,提升的效能還是很客觀的