2013-08-02 41 views
0

我有超過十億個唯一的字符串表示用戶名,我每隔幾分鐘就會同時添加數百萬,超過50%是重複的。我目前使用mySQL的InnoDB表。我正在使用INSERT IGNORE,但服務器無法跟上同時添加數百萬的負載(使用額外的大型CPU EC2實例)。爲了解決這個問題,我將批量存儲用戶名,並儘可能使用服務更新唯一表。同時插入數以百萬計的同時有十億個唯一字符串

我很樂意提供任何建議,我可以在ec2實例上合理設置。也許Redis可以實現我想要做的事情,但我還沒有使用它。任何人都可以建議存儲超過十億個獨特的字符串,而插入數百萬更有效的方式?

回答

0

每次檢查新密鑰是否重複時,瓶頸都必定是索引查找的絕對數量,並且每次插入新行時都會更新索引。每次發生這種情況時都需要鎖定整個表格。這種方法最終不會擴展。

我建議爲此使用多個數據庫實例!這樣,這些插入操作可以在多臺機器和多個磁盤上並行運行。

然後,您將使用某種散列來確定哪個名稱將放入哪個數據庫中。例如,以A-D開頭的名稱,E-H進入另一個等。

+0

感謝您的回答,您是正確的索引鎖定成爲一個問題。我沒有想過跨機器使用多個數據庫,但它是一個非常新穎的解決方案。這需要我獲得更多的資源來完成,但我不會爲此付出任何代價。 – Codewithcheese

0

1)我建議在MySQL上使用MariaDB - 通常您會獲得更好的性能。 MariaDB可以有多個活動主人寫作。如果你不知道它,它是MySQL的替代品。

2)你有存儲用戶名字段的索引嗎?

3)Redis是一個不錯的選擇。我使用它很多,它非常簡單和快速。我仍然無法告訴你它在這種負載下的表現有多好,但它很容易設置和嘗試。如果需要,您可以設置Redis羣集。

+0

感謝您的回答,我確實有一個關於用戶名的主索引,但是以我正在做的查找ups和插入索引鎖定的併發速度成爲問題。我不確定MariaDB是否會用Redis解決這個問題 – Codewithcheese

相關問題