我正在寫一份經過一些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。
- 減速是突然的,一個查詢需要幾毫秒,而下一個需要幾十秒。
我不知道爲什麼會發生這種情況。任何建議,將不勝感激。
我在這裏給出了答案,但是亞馬遜會在您運行一定數量的查詢後限制您的帶寬。無論他們實際上是在更慢地運行你的每一個查詢,還是隻以一定的時間間隔運行它們,都是任何人的猜測。 –
我實際上可以回答這個問題,當作業運行時,我在數據庫上運行了SHOW FULL PROCESSLIST,而查詢實際上需要更長的時間,它們並沒有間隔運行。但是他們如何才能使查詢運行更長?另外,我在哪裏可以看到?是否有限制等文件? – FrontierPsycho
那麼如果查詢與其他任務並行運行,那麼他們似乎需要更長的時間。 –