Итак, просматривая документы DynamoDB, они часто рекомендуют вам «группировать» элементы тогетера, связанные в одном разделе, чтобы лучше распределить использование вашего раздела.
Возьмем следующий пример, где у нас есть пользователь, у которого есть контакты и счета внутри его раздела:
Итак, если мне понадобятся все счета пользователя user_001, я просто сделаю запрос (псевдо):
QUERY WHERE PartitionKey = "user_001" AND SortKey.begins_with("invoice_")
Но недавно я заметил, что при использовании описанного выше способа возникает довольно серьезная проблема.
Видите ли, DynamoDB будет искать счета по всему разделу user_001 и потреблять емкость чтения на основе всех найденных предметов, независимо от того, были ли они в счетах или нет.
Это может оказаться очень неэффективным, если у вас слишком большой раздел, скажем, у меня было 10 000 контактов и 2 счета-фактуры, и получение этих двух счетов-фактур может оказаться очень дорогостоящим.
Я предполагаю, что это основано на цитате из документов:
DynamoDB рассчитывает количество единиц считываемой емкости на основе
размер элемента, а не количество данных, возвращаемых
применение
Решение:
Разве это не лучший подход?
1) Это лучше разделяет данные, поэтому мне не нужно использовать start_with
2) Это позволяет мне использовать uuid, основанный на времени, в качестве ключа сортировки и включить более сложное упорядочивание / разбиение на страницы
3) Я буду использовать гораздо меньше ресурсов для запросов, так как не нужно будет проходить пункты, которые мне не нужны
В чем вопрос?
Ну, то, что я сказал выше, это просто теории и предположения, документация не проясняет, как это действительно работает за кулисами, и даже рекомендует использовать рисунок 1.
Но я действительно думаю, что рисунок 2 здесь лучший, особенно если учесть, что теперь DynamoDB разумно распределяет емкость по вашим разделам (и не равномерно, как раньше)
Итак, мои мысли о том, что картинка 2 намного лучше, чем 1, действительны?