Хотя и 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).