2012-06-20 166 views
2

我們使用一系列在新加坡地區託管的AWS服務。我們有幾個EC2實例和一個RDS實例。我們計劃將一些數據遷移到Amazon DynamoDB,這有助於我們的應用程序數據設計。Amazon DynamoDB比Amazon RDS(php)慢嗎?

不幸的是,DynamoDB總是比RDS慢。我在與我們的EC2實例相同的區域創建的表中寫了一行。讀取此行花費1秒以上的時間使用AmazonAWS SDK for php,並且使用mysql從RDS中獲取一行所需時間比這少10倍以上。

我們可以做些什麼來優化它?我禁用了SSL,但我認爲它沒有太大區別。

+0

您可以隨時回答您自己的問題:-)感謝您的贊成票。 – greg

回答

4

可能。與RDS託管的數據庫(MySQL,SQL Server,Oracle)相比,DynamoDB具有相當大的延遲並且在較厚的應用程序堆棧上運行。

但是,IMO的DynamoDB(和大多數NoSQL dbs)的關鍵優勢在於延遲是可靠的。如果您在記錄檢索中看到400毫秒的延遲,則可以計算1個會話或100,000個會話的400毫秒延遲。我們可以在大多數情況下獲得多個記錄<秒,但是我並沒有真正使用針對PHP特定SDK(僅.Net)的DynamoDB方法。我想知道是否有其他的東西可能會瓶頸。]

+0

是的,當涉及到更大的數據集和更多的連接時,我瞭解到DynamoDB的優點是可靠性。但是我對400ms非常滿意,儘管它在RDS上比MySQL還要慢很多。我的1秒延遲是無法忍受的。我使用scan api調用根據字符串比較獲取記錄。這花了一秒鐘。你是否說這在.net驅動程序上更快? – Munim

+0

@Munim我不會認爲.net驅動程序會更快(或不足以引起關注)。因爲我沒有爲dynamoDB使用php SDK,所以我沒有一個參考點。我的直覺是,他們幾乎是相同的,*大部分的處理應該在服務上完成。 您掃描了多少條記錄?任何時候你可以在散列範圍上查詢,你應該比掃描快幾個數量級。 – Hal

+0

我一直在嘗試掃描和get_items散列範圍,他們都很慢。我現在只有一張表中的記錄來測試。 – Munim

5

看着你以前的評論我會說掃描是你的問題。您真的只想在絕對必要的時候使用它,即將數據饋送到map reduce以進行分析或沿着這些線路進行。據我所知,掃描實際上會遍歷每一條記錄,並尋找符合條件的條目(sloooowwwww),其中get/query可以使用索引良好的散列/範圍鍵。

如果可能,你應該構造你的數據,以便你可以查詢散列/範圍鍵,如果這是不可行的,你可以看看把你的元數據/查詢字段放入cloudsearch,使用它返回id直接從迪納摩獲取物品。您也可以設置一些異常表格(在不同的表格中重構相同的數據,以便您有不同的範圍鍵)

您不應該看到使用PHP SDK的get和query命令的那些大延遲時間。

+0

嗯..我可以從第二範圍鍵單獨拾取一個項目而不指定散列鍵嗎?我仍然不太熟悉散列/範圍鍵的概念。我認爲使用cloudsearch只會增加額外的請求開銷,我可能會試圖避免這種情況。我沒有想過去異化。這是一個有趣的想法。 – Munim

+0

其實沒有。我試着用一個簡單的getitem調用。它仍然很慢(> 1秒)。 – Munim

+2

@Munim - 如果getitem速度很慢,肯定會出現另一個問題。 – Hal

1

如果您將DynamoDB與適用於PHP的AWS開發工具包結合使用,則應確保始終與您正在使用的SDK版本保持同步。具體而言,您需要使用1.5.9+版本才能獲得DynamoDB操作的最佳性能。最近解決了一些問題,這些問題會給一些請求增加額外的延遲,所以這可能會幫助您解決很多問題。

另外,DynamoDB最近添加了對AWS SignatureV4簽名請求的支持,從而不再需要SDK先前爲您檢索和緩存的STS憑證。這也應該有助於提高性能。

+0

感謝您的提示。我已經通過在我的服務器上修復緩存來解決了大部分延遲問題,但我也會研究該庫的較新版本。 – Munim