2015-04-16 43 views
0

我的表有以下模式: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) 
       ) 
      ) 
     ), 
    )); 

但我必须运行这个查询每个代理服务器,并有100个他们。有什么方法可以在单个查询中完成这项工作吗?

+0

您可以使用'IN'而不是'EQ'例如 –

+0

'IN'比较运算符不可用于查询 – user1151659

+0

然后使用扫描代替查询 –

回答

0

听起来像你不会找到dynamodb API正确的解决方案,因为它是不适合这种类型的问题。

,你基本上要的是做一个范围查询,而不哈希 - 打破元素的均匀分布散列是DynamoDB需要,以提供一致的和可预测的性能的概念。

我的建议是DynamoDB的外面看,如果这就是你需要回答的问题。如果数据不是太大 - 我建议你坚持使用MySQL的这种情况

0

没有办法做到这一点与一个单一的查询,但取决于now()-10 minutes之间的各个时间戳的数量,它可能在桌上使用Global Secondary Index更有效率。

例如:

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

您只需要查询您需要的时间戳和你将得到共享该时间戳所有代理服务器的ID。

我诚实地不相信,这对你是一个好办法,但东西给你思考的问题。我有一个类似的场景,用一个更简单的要求来跟踪每天创建的最新记录。对于我来说,每天以整数形式存储并且有一个全局二级索引来查询每天的所有记录非常简单。

+0

问题是,可能存在10 x 60 x 1000个可能的时间戳'现在()'和'-10分钟',因为每个节点独立推送数据 – user1151659

+0

是的,糟糕的主意呢! :) – readyornot

相关问题