1. 程式人生 > >mongodb大資料量分頁查詢效率問題

mongodb大資料量分頁查詢效率問題

最常見的分頁採用的是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'
	})
}

這個方法雖然多了一次資料庫查詢,但是對於幾十萬往上的查詢結果分頁來說,提升的效能還是很客觀的