84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
如题,我前两天去参加 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}}