2015-04-16 78 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

相關問題