天天看點

使用MongoDB快速分頁

使用MongoDB快速分頁

英文原文:

http://blog.mongodirector.com/fast-paging-with-mongodb/

通過你的資料分頁是使用MongoDB最常用操作之一。典型的案例是需要在你的UI的表格中顯示結果。如果你正在批處理資料,分頁政策正确是很重要的,以緻你的資料處理可擴充。

讓我們通過一個示例來看看在MongoDB中通過資料分頁的不同方法。在這個示例中,我們有一個使用者資料庫CRM,我們需要分頁并一次顯示10個使用者。是以我們的分頁大小是10.這是我們的使用者文檔結構:

方法1:使用skip()和limit()

MongoDB本地支援使用skip()和limit()指令的分頁操作。skip(n)指令告訴MongoDB跳過n條結果,limit(n)指令告訴MongoDB限制結果長度為“n”個結果。典型地你會通過遊标使用skip()和limit()指令 – 但是為了描述這個案例我們提供了控制台指令來完成相同的結果。因為代碼的簡潔性,也排除了檢查代碼的限制。

你明白了。通常擷取第n頁的代碼像這樣:

然而随着資料大小的增長,該方法有嚴重的性能問題。原因是每次查詢執行時,完整的結果集被建構,然後執行個體必須從集合的開始定位到特定的偏移位置。因為你的偏移增加,這個過程變得越來越慢。這個過程也不能有效利用索引。是以典型地“skip()”和“limit()”方法對于小的資料集時是有效的。如果你使用大資料集,你需要考慮其他方法。

方法2:使用find()和limit()

之前的方法擴充得不是很好的原因是skip()指令。是以這部分的目标是不使用“skip()”指令執行分頁。我們使用時間戳或文檔中的id以自然順序存儲資料。在這個示例中,我們使用存儲在每個文檔中的“_id”。“_id”是一個MongoDB的ObjectID結構,是一個12位元組的結構,包含時間戳、機器、程序ID、計數器等。整體想法如下:

1. 擷取目前頁最後文檔的_id

2. 擷取大于該“_id”的下一頁的文檔

該方法保持了存在于“_id”列中的固有順序。也因為“_id”列預設被索引,查找性能非常好。如果你正使用的列沒有被索引,你的性能将會變差 -- 是以確定該列有索引是很重要的。

如果你也想為你的分頁以特定順序排列資料,你可以用以上技術使用sort()從句。確定排序過程覆寫索引獲得最佳性能非常重要。你可以使用.explain字尾到你的查詢去決定。

一如既往如果你有任何問題或者評論請随時聯系我們[email protected]