2015-05-07 48 views
1

我正在寫一份經過一些MySQL表的選擇,根據某些critera選擇某些行,從中提取電子郵件地址並向每個人發送一封電子郵件。來自Go的連續MySQL查詢在某點之後變得慢得多

的過濾過程着眼於一個表(姑且稱之爲storage),這是相當大的(〜6GB傾倒),看起來像這樣:

Columns: 
id  varchar(64) PK 
path varchar(64) PK 
game varchar(64) 
guid varchar(64) 
value varchar(512) 
timestamp timestamp 

有兩個指標:(id, path)(的PK由上述可見)和​​。

工作的第一檢索的GUID的一長串從一個表,然後批處理他們在storage表執行這樣的連續查詢:

SELECT guid, timestamp FROM storage 
WHERE game = 'somegame' 
AND path = 'path' AND value = 'value' AND timestamp >= '2015-04-22 00:00:00.0' AND timestamp <= '2015-04-29T14:53:07+02:00' 
AND guid IN (...) 

IN子句中包含GUID的列表。

我需要檢索時間戳才能夠進一步篩選。

當針對我的本地MySQL運行時,一切都按預期工作,查詢大約需要180ms,批量爲1000個GUID。

當對亞馬遜RDS同一數據庫上運行,查詢開始快速,但經過某些時候,他們突然開始服用大約30秒,並繼續這樣做,直到作業結束。

我已經嘗試了很多很多事情來解決這個問題,但無法找出原因。一些注意事項:

  • 該作業只使用一個sql.DB對象。另外,我準備上述說明並重復使用它。
  • 起初,我以爲是因爲RDS DB運行MySQL 5.5,而且我運行的是5.6。我做了RDS DB的複製品,升級到5.6,再次運行這項工作。問題再次發生。
  • 兩個數據庫中的數據量是相同的:我傾銷生產數據庫並將其導入到本地數據庫並運行作業。相同的行爲(它仍然在本地快速運行)。
  • 對RDS節點的AWS監控不會顯示任何明顯的峯值。 CPU使用率從1%跳到10%,這項工作似乎只打開了幾個連接(〜4)。
  • 我有一位同事在他們的PC上運行這個工作,指向我的我的 MySQL數據庫,只是爲了確保卓越的性能不是源於連接本地的事實。它的運行速度與我的電腦一樣快(不可否認,通過局域網)。
  • 我從我的本地PC和上運行了RDS 的作業,Amazon EC2節點與RDS相當接近。從EC2來看,它表現更好,但問題依然存在。
  • 作業非常併發,每一步都有輸入和輸出通道(緩衝區大小爲1000),並且工作由goroutines執行。在這些步驟之間,我有其他的goroutines批量輸出以前的goroutine。
  • 減速是突然的,一個查詢需要幾毫秒,而下一個需要幾十秒。

我不知道爲什麼會發生這種情況。任何建議,將不勝感激。

+0

我在這裏給出了答案,但是亞馬遜會在您運行一定數量的查詢後限制您的帶寬。無論他們實際上是在更慢地運行你的每一個查詢,還是隻以一定的時間間隔運行它們,都是任何人的猜測。 –

+0

我實際上可以回答這個問題,當作業運行時,我在數據庫上運行了SHOW FULL PROCESSLIST,而查詢實際上需要更長的時間,它們並沒有間隔運行。但是他們如何才能使查詢運行更長?另外,我在哪裏可以看到?是否有限制等文件? – FrontierPsycho

+0

那麼如果查詢與其他任務並行運行,那麼他們似乎需要更長的時間。 –

回答

0

因此,經過大量的實驗後,我找到了解決方案。

我在所涉及的RDS實例上使用磁性存儲,這可確保大約100 IOPS。這限制了我們可以查詢數據的速度。

我使用2000 Provisioned IOPS進行了測試,並且作業一路很快。