要添加到@Justinas的答案,迪納摩將有非常可怕的分頁性能,如果隨機訪問(即跳轉到任意頁)是所需的。但是,如果只執行下一頁和上一頁,則可以傳遞LastEvaluatedKey
,並將由於掃描造成的開銷降至最低。
正如評論中所述,您應該儘可能地緩存結果。至少,可以緩存LastEvaluatedKey
結果,以便在用戶翻閱結果時不需要爲每個分頁請求重新計算結果。這裏是我的意思的一個例子:
假設你有一個表格,像這樣的模式,其中CommentID
是散列鍵。
CommentID | Author | Comment | ...
-----------+--------+---------+------------
1 | Joe | Foo | ...
2 | Joe | Bar | ...
3 | John | Baz | ...
4 | Joe | FooBar | ...
5 | Jane | BooBaz | ...
6 | Joesie | Blah | ...
7 | Johnny | Blahaha | ...
當您啓動傳呼,說你要求每頁3條評論,你會得到第一頁的結果和LastEvaluatedKey = 3
;然後,如果您再次發出掃描請求,請使用ExclusiveStartKey=3
進行第2頁掃描,您將獲得LastEvaluatedKey = 6
;要獲得第3頁,您可以使用LastEvaluatedKey = 6
..等進行另一次掃描。
您可以看到,如果沒有任何形式的緩存,您將執行三次掃描(如果您在第3頁之前還請求了第1頁和第2頁,則會重複其中的兩次)。所以,我提出的優化是爲每個頁面存儲相應的鍵。你會最終得到這樣的地圖:
Page | Hash-Key
------+----------
1 | null
2 | 3
3 | 6
.. | ...
而當你翻頁結果時,這些值將被填寫。現在,當用戶想要第3頁時,您只需執行一次掃描,使用6
作爲ExclusiveStartKey
。
當然,對於每個頁面大小,您都需要一個像這樣的查找表,並且只有在新行被添加(或刪除)之前,表纔會準確無誤。也就是說,如果你有很多請求,存儲分頁緩存所需的額外內存將非常值得。剩下的就是爲你的分頁緩存設置一個合理的到期時間,這取決於你的表中新增數據的頻率(或刪除)。
這樣,沒有大量緩存,對於性能來說會非常糟糕任何其他頁面然後頭幾個 –
@MikeDinescu是的,我知道。有更好的解決方案 – Justinas
不,不是真的;我並不是說有一個更好的解決方案,只是在那裏發出警告;我能想到的唯一改進就是確保緩存結果(或者至少是LastEvaluatedKey,這樣後續調用不會受到每次掃描的懲罰) –