DynamoDB Query - GSI - PullRequest
       6

DynamoDB Query - GSI

0 голосов
/ 25 апреля 2018

Скажите, если бы у меня была таблица DynamoDB:

UserId: S
BookName: S
BorrowedTimestamp: S
HasReturned: B

UserId (раздел) и BookName (диапазон) будут ключами в базовой таблице.

Однако я хочу сделать запрос, используя другие неключевые поля, например, BorrowedTimestamp> 3days и HasReturned имеет значение false.

Я думаю, мне нужно настроить GSI, чтобы этот запрос работал, но он звучит неправильно, имея двоичное поле HasReturned в качестве ключа раздела (с BorrowedTimestamp в качестве ключа диапазона). Это правильно, или я что-то упустил?

1 Ответ

0 голосов
/ 26 апреля 2018

Нет, вам не нужен GSI, но он может быть более эффективным в зависимости от ваших обстоятельств.

Давайте возьмем ваш пример BorrowedTimestamp> 3days. Я собираюсь предположить, что это для конкретного пользователя, поэтому у вас есть идентификатор пользователя для запроса.

Вы можете выполнить запрос с KeyConditionExpression, равным userid, затем FilterExpression, равным BorrowedTimestamp > 3days. Допустим, у пользователя есть 10 книг, и у 2 из них есть BorrowedTimestamp > 3days. Этот запрос будет стоить вам 10 RCU (единиц измерения емкости). Это потому, что FilterExpression просто отфильтровывает элементы в вашем наборе результатов - DynamoDB фактически нашел все 10 элементов в запросе.

Теперь предположим, что у вас есть GSI, где ключ разделения был userid, а ключ диапазона был BorrowedTimestamp. Ваш KeyConditionExpression может указывать как ключ разделения userid, так и ключ диапазона BorrowedTimestamp > 3days. Результат будет точно таким же. Однако на этот раз это будет стоить вам только 2 RCU, и эти RCU будут получены из емкости индекса, а не из таблицы.

Меньше RCU звучит хорошо, но помните, что вам необходимо отдельно приобрести пропускную способность для вашего основного индекса и GSI. Это может быть менее эффективно, потому что вы не можете разделить купленную пропускную способность между запросами, которые используют ваш первичный ключ и GSI.

Наконец, если вы вообще не хотите указывать идентификатор пользователя, вы должны использовать scan . Сканы иногда плохо масштабируются, потому что они всегда оценивают каждый элемент таблицы, но то, работает ли он для вас, зависит от многих вещей (например, от того, как часто вы будете использовать сканирование, сколько элементов у вас будет в таблице и т. Д.). ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...