DynamoDB — получить все строки, где первичный ключ находится в диапазоне

Моя таблица имеет следующую схему:

Ключ хеширования: ProxyID
Ключ диапазона: метка времени

Исходя из фона MySQL, я хочу выполнить такой запрос:

SELECT * FROM table WHERE Timestamp < now() - 10 minutes

По сути, я хочу получить последние несколько записей каждого прокси. Прямо сейчас я использую это:

$client->query(array(
'TableName' => 'server_logs',
'AttributesToGet' => array('Proxy ID', 'Timestamp', 'usageCPUTotalPercent', 'numberOfUsers', 'usageMemoryTotalPercent'),
'KeyConditions' => array(
'Proxy ID' => array(
'ComparisonOperator' => 'EQ',
'AttributeValueList' => array(
array('N' => (String)$proxyId)
)
),
'Timestamp' => array(
'ComparisonOperator' => 'BETWEEN',
'AttributeValueList' => array(
array('N' => (String)$fromTime),
array('N' => (String)$toTime)
)
)
),
));

Но я должен выполнить этот запрос для КАЖДОГО прокси-сервера, и их сотни. Есть ли способ, которым я могу сделать это в одном запросе?

0

Решение

Похоже, вы не найдете правильного решения в API Dynamodb, так как оно не подходит для этого типа проблем.

По сути, вы хотите выполнить запрос диапазона без хэширования, нарушая концепцию равномерно распределенного хеширования элементов, которая требуется DynamoDB для обеспечения согласованной и предсказуемой производительности.

Мой совет — смотреть вне DynamoDB, если на этот вопрос вам нужно ответить. Если данные не слишком велики — я предлагаю вам придерживаться MySQL для этого случая

0

Другие решения

Нет способа сделать это с помощью одного запроса, но в зависимости от количества отдельных временных отметок между now() а также -10 minutes, может быть более эффективно использовать Глобальный вторичный индекс на столе.

Например:

Index name: ProxiesByTime
Hash key: Timestamp
Range key: ProxyID

Вам нужно только запросить нужные вам временные метки, и вы получите все идентификаторы прокси-серверов, которые используют эту временную метку.

Я, честно говоря, не убежден, что это хороший подход для вас, но вам нужно подумать. У меня похожий сценарий с гораздо более простым требованием отслеживать последние записи, созданные за день. Мне легко хранить каждый день как целое число и иметь глобальный вторичный индекс для запроса всех записей по дням.

0