В чем разница между проверкой и запросом в dynamodb? При использовании сканирования/запроса?
Операция запроса, указанная в документации DynamoDb:
Операция запроса выполняет поиск только значений атрибутов первичного ключа и поддерживает подмножество операторов сравнения по ключевым значениям атрибутов для уточнения процесса поиска.
и операцию сканирования:
Операция сканирования сканирует всю таблицу. Вы можете указать фильтры для применения к результатам, чтобы уточнить возвращаемые вам значения после полного сканирования.
Это лучше всего основывается на характеристиках производительности и стоимости.
Ответы
Ответ 1
У вас есть ключ/первичный ключ раздела таблицы Dynamodb как customer_country
. Если вы используете запрос, то поле customer_country
является обязательным для выполнения операции запроса. Из всех фильтров могут быть сделаны только те элементы, которые принадлежат customer_country
.
Если вы выполните сканирование таблицы, фильтр будет выполнен для всех ключей раздела/первичного ключа. Сначала он извлекает все данные и применяет фильтр после извлечения из таблицы.
например:
здесь customer_country
- ключ раздела/первичный ключ, а id
- ключ sort_
-----------------------------------
customer_country | name | id
-----------------------------------
VV | Tom | 1
VV | Jack | 2
VV | Mary | 4
BB | Nancy | 5
BB | Lom | 6
BB | XX | 7
CC | YY | 8
CC | ZZ | 9
------------------------------------
-
Если вы выполняете операцию запроса, она применяется только к значению customer_country
. Значение должно быть только равным оператору (=).
-
Таким образом, выбираются только элементы, равные этому ключу раздела/значению первичного ключа.
-
Если вы выполняете операцию сканирования, она выбирает все элементы в этой таблице и отфильтровывает данные после того, как получает эти данные.
Примечание: не выполняйте операцию сканирования, она превышает ваш RCU.
Ответ 2
При создании таблицы Dynamodb выберите Первичные ключи и Локальные вторичные индексы (LSI), чтобы операция Query возвращала нужные вам элементы.
Операции запроса поддерживают только одинаковую оценку оператора первичного ключа, но условные (=, <, <=,>,> =, Between, Begin) для ключа сортировки.
Операции сканирования, как правило, медленнее и дороже, так как операция должна проходить по каждому элементу в вашей таблице, чтобы получить запрашиваемые элементы.
Пример:
Table: CustomerId, AccountType, Country, LastPurchase
Primary Key: CustomerId + AccountType
В этом примере вы можете использовать операцию Query для получения:
- CustomerId с условным фильтром для AccountType
Операция сканирования должна быть использована для возврата:
- Все клиенты с определенным типом учетной записи
- Элементы на основе условных фильтров по стране, т.е. все клиенты из США
- Товары, основанные на условных фильтрах LastPurchase, т.е. все клиенты, которые сделали покупку в прошлом месяце
Чтобы избежать операций сканирования часто используемых операций, создайте локальный вторичный индекс (LSI) или глобальный вторичный индекс (GSI).
Пример:
Table: CustomerId, AccountType, Country, LastPurchase
Primary Key: CustomerId + AccountType
GSI: AccountType + CustomerId
LSI: CustomerId + LastPurchase
В этом примере операция Query может позволить вам получить:
- CustomerId с условным фильтром для AccountType
- [GSI] Условный фильтр по CustomerIds для определенного AccountType
- [LSI] CustomerId с условным фильтром на LastPurchase
Ответ 3
С точки зрения производительности, я думаю, что хорошей практикой является разработка таблицы для приложений, использующих Query
вместо Scan
. Поскольку операция сканирования всегда сканирует всю таблицу, прежде чем она отфильтровывает нужные значения, это означает, что для обработки таких операций, как чтение, запись и удаление, требуется больше времени и пространства. Для получения дополнительной информации, пожалуйста, обратитесь к официальному документу
Ответ 4
Запрос гораздо лучше, чем сканирование - по производительности. scan, как следует из названия, будет сканировать всю таблицу. Но вы должны хорошо знать ключ таблицы, ключ сортировки, индексы и связанные с ними индексы сортировки, чтобы знать, что вы можете использовать запрос. если вы фильтруете свой запрос, используя:
- ключ
- ключ и ключ сортировки
- индекс
- Индекс и связанный ключ сортировки
используйте запрос! в противном случае используйте сканирование, более гибкое в отношении того, какие столбцы вы можете фильтровать.
Вы НЕ МОЖЕТЕ Запрашивать, если:
- более 2 полей в фильтре (например, ключ, сортировка и индекс)
- только ключ сортировки (первичного ключа или индекса)
- регулярные поля (не ключ, индекс или сортировка)
- смешанный индекс и сортировка (index1 с сортировкой index2)\
- ...
хорошее объяснение: https://medium.com/@amos.shahar/dynamodb-query-vs-scan-sql-syntax-and-join-tables-part-1-371288a7cb8f