В чем разница между атрибутом и ключом в запросе DynamodB - PullRequest
0 голосов
/ 13 февраля 2020

Скажем, у меня "name" в качестве моего первичного ключа и "timestamp" в качестве моего sortkey. Я понял, что могу сделать запрос, используя как Attr ("timestamp"), так и Key ("timestamp").

Я также могу выполнить сканирование таблицы с использованием filterexpression (Attr ("account"). Eq ("john" ")) а также запрос uding keyconditionexpression = Key (" account "). eq (" john "), который дает мне тот же результат.

Итак, у меня два вопроса. В целом, если у меня те же условия, будет ли иметь значение, если я использую сканирование или запрос? Каково значение наличия ключа сортировки, отличного от любого другого числового атрибута, когда я делаю запрос?

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Хотя и Scan с FilterExpression и Query с KeyConditionExpression могут возвращать одинаковые результаты, существует большая разница в способах, производительности и стоимости для вас. В вашем случае настоятельно рекомендуется использовать Query, а не Scan. Позвольте мне объяснить:

A Scan всегда сканирует всю таблицу. Он может отфильтровать вещи в соответствии с FilterExpression, но DynamoDB все еще должен прочитать все элементы в таблице, и вы будете платить за эти чтения. Сканирование с очень избирательным FilterExpression (которое возвращает только небольшое подмножество таблицы) почти всегда плохая идея. Это будет очень медленно и будет стоить вам очень дорого по сравнению с объемом данных, которые вы пытаетесь прочитать.

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

Query может сделать это эффективно благодаря тому, как работают ключи разделов DynamoDB и ключи сортировки: ключ раздела также называется «ключом ha sh», поскольку он позволяет DynamoDB эффективно находить указанный раздел c, как в ha sh стол, без сканирования всей таблицы. Затем, внутри одного раздела, элементы сортируются по ключу сортировки, поэтому для нахождения непрерывного диапазона ключей сортировки (как можно указать KeyConditionExpression), DynamoDB не нужно сканировать все элементы в раздел - он может эффективно найти запрошенный диапазон в O (logN).

0 голосов
/ 13 февраля 2020

Операция сканирования очень дорогая, так как требует чтения всей таблицы. Кроме того, операция сканирования - верный путь к пределу DynamoDB в 1 МБ для объема данных, которые он может извлечь, поэтому вам, скорее всего, придется выполнить несколько сканирований и использовать NextToken для продолжения сканирования таблицы. В большинстве случаев не рекомендуется использовать сканирование.

Здесь вы можете узнать больше о операции сканирования.

Ключевой атрибут в DynamoDB может зависеть от условий в запросе, а неключевой атрибут - нет. Кроме того, DynamoDB поддерживает только = (равно) условие для атрибутов первичного ключа.

Здесь вы найдете больше о том, как выбрать правильный ключ разделения.

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