如題,我前兩天去參加 MongoDB 使用者團體交流會時,聽講師說到資料量大的話不要使用 skip 和 limit 因為,這樣會一行一行的數到想到的頁數再取 PageSize 的數量。當然他們也提了另一個方法,但只略講了一句。
我在這裡提問是想知道具體怎麼做?求思路。
业精于勤,荒于嬉;行成于思,毁于随。
如果你是想取“下一頁”或“上一頁”,可以透過查詢大於某個_id的sort+limit來實現。 如果你是想取“第xxx頁”,如果想要完全精確,其實沒有多好的辦法,分頁本身是“挨個數”的邏輯,有沒有索引都避免不了這個耗時的過程。 在分頁數非常大的情況下,排在幾千萬之後的數字並沒有多少人關心,你可以使用redis做頁數對_id列表的緩存,每隔一段時間更新一次。 這個問題的根本點在於:「索引所依賴的b+結構不能用於排名計算」。
記錄上次查詢的最後一個_id, 下次查詢{_id: {$gt: last_id}}
如果你是想取“下一頁”或“上一頁”,可以透過查詢大於某個_id的sort+limit來實現。
如果你是想取“第xxx頁”,如果想要完全精確,其實沒有多好的辦法,分頁本身是“挨個數”的邏輯,有沒有索引都避免不了這個耗時的過程。
在分頁數非常大的情況下,排在幾千萬之後的數字並沒有多少人關心,你可以使用redis做頁數對_id列表的緩存,每隔一段時間更新一次。
這個問題的根本點在於:「索引所依賴的b+結構不能用於排名計算」。
記錄上次查詢的最後一個_id, 下次查詢{_id: {$gt: last_id}}