Что лучше по производительности при запросе данных 50 ГБ? Это MYSQL SELECT с условием или Dynamodb SCAN с выражениями FiLTER?

Я получаю некоторые данные о посещаемости веб-сайта, используя опцию «сканирование» в Dynamodb. Я использовал filterExpression, чтобы отфильтровать их. Я буду сканировать большую таблицу, в которой будет более 20 ГБ данных.

Я обнаружил, что DynamoDB сканирует всю таблицу и отфильтровывает результаты. В документе говорится, что он возвращает только 1 МБ данных, а затем мне нужно снова пройти через цикл, чтобы получить остальное. Кажется, это плохой способ заставить эту работу работать. получил ссылку отсюда: Выражение фильтра Dynamodb не возвращает все результаты

Для небольшого стола этого должно хватить.

Думаю, MySQL доза такая же. Я не уверен.

Что быстрее читать, так это выбор MySQL или сканирование DynamoDB для большого набора данных. ?

Есть ли другая альтернатива? какие мысли и предложения?

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

$params = [
      'TableName' => $tableName,
      'FilterExpression' => $this->filter.'=:'.$this->filter.' AND #dy > :since AND #dy < :now',
      'ExpressionAttributeNames'=> [ '#dy' => 'day' ],
      'ExpressionAttributeValues'=> $eav
    ];

    var_dump($params);

    try {
      $result = $dynamodb->scan($params);

После рассмотрения предложения это сработало для меня

$params = [ 
'TableName' => $tableName,
 'IndexName' => self::GLOBAL_SECONDARY_INDEX_NAME, 
'ProjectionExpression' => '#dy, t_counter , traffic_type_id', 'KeyConditionExpression' => 'country=:country AND #dy between :since AND :to', 
'FilterExpression' => 'traffic_type_id=:traffic_type_id' 'ExpressionAttributeNames' => ['#dy' => 'day'],
'ExpressionAttributeValues' => $eav 
]; 

person danuddara    schedule 27.06.2019    source источник
comment
Это очень субъективно; DymanoDB и MySQL имеют очень разные функции и плюсы / минусы. У нас есть базы данных, размер которых намного превышает 50 ГБ, и они превосходно работают с любым инструментом, который мы используем для работы, - пока вы выбираете индексы для обоих размеров, это не имеет особого значения. Если вы думаете о том, что делает MySQL, вы (потенциально) делаете сотни вызовов, чтобы получить множество маленьких пакетов данных, Dynamo - то же самое. 20 ГБ в одном ответе - это ОГРОМНО, и я, вероятно, рассмотрел бы подход S3 (поскольку вы используете AWS) с меньшей базой данных, чтобы найти нужную запись.   -  person Robbie    schedule 27.06.2019


Ответы (1)


Если ваши данные похожи на пару "ключ-значение" и у вас есть фиксированные поля, которые вы хотите проиндексировать, используйте DynamoDB - вы можете создавать индексы для всех полей, которые хотите запрашивать, и он будет отлично работать.

Если вам требуются сложные запросы по нескольким индексам, подойдет любая СУБД.

Если вы можете запросить что угодно, подумайте об эластичном поиске.

Если ваши запросы очень простые, но у вас есть большие данные, которые нужно извлекать в каждом запросе. Подумайте о S3. Возможно, вы можете индексировать метаданные в DynamoDb, а фактические данные могут быть в S3

person dDarkLORD    schedule 01.07.2019
comment
Спасибо. Ваш совет по созданию индексов и запросов пар ключ-значение сработал. ‹Code› $ params = ['TableName' = ›$ tableName, 'IndexName' =› self :: GLOBAL_SECONDARY_INDEX_NAME, 'ProjectionExpression' = ›'#dy, t_counter, traffic_type_id', 'KeyConditionExpression' =› 'country =: country AND #dy между: с И: до ',' FilterExpression '= ›' traffic_type_id =: traffic_type_id '' ExpressionAttributeNames '=› [' #dy '= ›' day '],' ExpressionAttributeValues ​​'=› $ eav. ]; - person danuddara; 14.09.2019