Получить определенное количество элементов на основе rangeKey без необходимости сканирования - PullRequest
0 голосов
/ 08 декабря 2018

Допустим, у меня есть какая-то платформа для форумов и дискуссий, и у меня есть таблица DynamodB, в которой хранятся сообщения.Ключом хеширования может быть некоторый уникальный идентификатор, а ключом диапазона может быть метка времени, в которую было создано сообщение.

Теперь я хочу получить 10 последних сообщений.Тем не менее, я знаю, что операция сканирования очень дорогая, и поэтому хочу избежать ее использования.Можно ли как-нибудь запросить 10 последних сообщений без необходимости сканирования?

Я не знаю, как.

1 Ответ

0 голосов
/ 09 декабря 2018

Вы должны использовать GSI с таким атрибутом, как 'yyyy-mm-dd' в качестве ключа хеш-функции и timestamp в качестве ключа диапазона.Поскольку возможно, что за один день будет менее 10 комментариев, вам может потребоваться более одного запроса, но это довольно просто выполнить.

Псевдокод:

currentDate = today
while (results.size < 10)
    results.add(queryDynamoDB(currentDate))
    currentDate.subtract(1 day)

При запросеиндекс, запрос должен иметь

scanIndexForward = false
limit = 10

Таким образом, он будет возвращать до 10 результатов, которые являются самой последней отметкой времени для данного дня.Вам придется запрашивать более одного дня, если ваш форум не очень активен или новый день только начался.(Запросы на более чем один день не будут иметь значительных дополнительных затрат в RCU, только дополнительные задержки.)

Редактировать: Просто чтобы прояснить, это GSI, который я предлагаю.Поле YYYY-MM-DD - это поле, которое существует только для GSI.Основная таблица должна использовать какой-то уникальный (не основанный на времени) идентификатор в качестве хеш-ключа.

...