【问题标题】:What is better on Performance when Querying 50 GB data ? Is it MYSQL SELECT with a condition or Dynamodb SCAN with FiLTER Expressions?查询 50 GB 数据时性能哪个更好?是带有条件的 MYSQL SELECT 还是带有过滤器表达式的 Dynamodb SCAN?
【发布时间】:2020-01-07 08:07:41
【问题描述】:

我正在使用 Dynamodb 中的“扫描”选项检索网站的一些流量数据。我已经使用 filterExpression 将它们过滤掉。 我将对一个包含超过 20GB 数据的大表进行扫描。

我发现 DynamoDB 会扫描整个表并将结果过滤掉。该文件说它只返回 1MB 的数据,然后我必须再次循环以获取其余数据。这似乎是完成这项工作的坏方法。 从这里得到参考:Dynamodb filter expression not returning all results

对于应该没问题的小桌子。

我猜 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 
]; 

【问题讨论】:

  • 这是非常主观的; DymanoDB 和 MySQL 有非常不同的特性和优缺点。我们拥有远远大于 50GB 的数据库,并且在我们用于这项工作的任何工具中都表现出色 - 只要您为这两种大小选择索引就不会真正重要。如果您考虑 MySQL 正在做什么,您(可能)会进行数百次调用以获取大量小数据包,Dynamo 也是如此。一个响应中的 20GB 是巨大的,我可能正在考虑使用 S3 方法(就像您在 AWS 上一样),使用较小的参考数据库来查找正确的记录。

标签: php amazon-web-services nosql amazon-dynamodb dynamodb-queries


【解决方案1】:

如果您的数据类似于键值对,并且您有要为其编制索引的固定字段,请使用 DynamoDB - 您可以在所有要查询的字段上创建索引,它会很好用

如果您需要对多个索引进行复杂查询,那么任何 RDBMS 都可以。

如果您可以查询任何内容,请考虑 弹性搜索

如果您的查询非常简单,但您在每个查询中都需要检索大量数据。想想 S3。也许您可以在 DynamoDb 中索引元数据,而实际数据可以在 S3 中

【讨论】:

  • 谢谢。您关于制作键值对索引和查询的建议效果很好。 $params = [ 'TableName' =&gt; $tableName, 'IndexName' =&gt; self::GLOBAL_SECONDARY_INDEX_NAME, 'ProjectionExpression' =&gt; '#dy, t_counter , traffic_type_id', 'KeyConditionExpression' =&gt; 'country=:country AND #dy 在 :since AND :to', 'FilterExpression' =&gt; 'traffic_type_id=:traffic_type_id' 'ExpressionAttributeNames' =&gt; ['#dy' =&gt; 'day'], 'ExpressionAttributeValues' =&gt; $eav 之间。 ];
猜你喜欢
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
相关资源
最近更新 更多