При создании таблицы Dynamodb выберите «Первичные ключи» и «Локальные вторичные индексы» (LSI), чтобы операция запроса возвращала нужные элементы.
Операции запроса поддерживают только оценку оператора равенства для первичного ключа, но с условием (=, <, <=,>,> =, между, начало) для ключа сортировки.
Операции сканирования обычно медленнее и дороже, так как операция должна проходить через каждый элемент в вашей таблице, чтобы получить элементы, которые вы запрашиваете.
Пример:
Table: CustomerId, AccountType, Country, LastPurchase
Primary Key: CustomerId + AccountType
В этом примере вы можете использовать операцию запроса, чтобы получить:
- CustomerId с условным фильтром по AccountType
Для возврата необходимо использовать операцию сканирования:
- Все клиенты с определенным типом учетной записи
- Товары основаны на условных фильтрах по странам, т.е. все клиенты из США.
- Товары, основанные на условных фильтрах по LastPurchase, то есть всем клиентам, совершившим покупку в прошлом месяце.
Чтобы избежать операций сканирования при часто используемых операциях, создавая локальный вторичный индекс (LSI) или глобальный вторичный индекс (GSI).
Пример:
Table: CustomerId, AccountType, Country, LastPurchase
Primary Key: CustomerId + AccountType
GSI: AccountType + CustomerId
LSI: CustomerId + LastPurchase
В этом примере операция запроса может позволить вам получить:
- CustomerId с условным фильтром по AccountType
- [GSI] Условный фильтр CustomerIds для определенного AccountType.
- [LSI] CustomerId с условным фильтром для LastPurchase.
У вас есть ключ / первичный ключ раздела таблицы Dynamodb как
customer_country
. Если вы используете запрос,customer_country
это обязательное поле для выполнения операции запроса. Все фильтры можно делать только по предметам, принадлежащимcustomer_country
.Если вы выполните сканирование таблицы, фильтр будет выполняться для всех ключей раздела / первичного ключа. Сначала он извлекает все данные и применяет фильтр после выборки из таблицы.
например:
здесь
customer_country
является ключевым раздел / первичный ключ иid
является sort_keyЕсли вы выполняете операцию запроса, она применяется только к
customer_country
значению. Значение должно быть только равным оператору (=).Таким образом, выбираются только элементы, равные этому ключу раздела / значению первичного ключа.
Если вы выполняете операцию сканирования, он выбирает все элементы в этой таблице и отфильтровывает данные после получения этих данных.
Примечание: не выполняйте операцию сканирования, если он превышает ваш RCU.
источник
Запрос намного лучше сканирования - с точки зрения производительности. scan, как следует из названия, будет сканировать всю таблицу. Но вы должны хорошо знать ключ таблицы, ключ сортировки, индексы и связанные с ними индексы сортировки, чтобы знать, что вы можете использовать запрос. если вы фильтруете свой запрос, используя:
используйте Query! в противном случае используйте сканирование, которое позволяет более гибко определять, какие столбцы можно фильтровать.
вы НЕ можете запрашивать, если:
хорошее объяснение: https://medium.com/@amos.shahar/dynamodb-query-vs-scan-sql-syntax-and-join-tables-part-1-371288a7cb8f
источник
С точки зрения производительности, я считаю хорошей практикой создавать таблицу для приложений, которые будут использовать
Query
вместо нееScan
. Поскольку операция сканирования всегда сканирует всю таблицу, прежде чем отфильтровать желаемые значения, это означает, что требуется больше времени и места для обработки таких операций с данными, как чтение, запись и удаление. Для получения дополнительной информации обратитесь к официальному документуисточник
Аналогично реляционной базе данных.
Получите, что
query
вы используете первичный ключ вwhere
условии, сложность вычисленийlog(n)
что большая часть структуры ключа представляет собой двоичное дерево.во время
scan
запроса вы должны сканировать всю таблицу, а затем применять фильтр к каждой,row
чтобы найти правильный результат. Спектакль естьO(n)
. Это намного медленнее, если ваш стол большой.Короче, попробуйте использовать,
get
если знаете первичный ключ. толькоscan
в худшем случае.Кроме того, подумайте о глобальном вторичном индексе для поддержки разных типов запросов по разным ключам, чтобы повысить производительность.
источник