我在EC2上运行了一个写密集型应用程序。有关如何优化它以便能够在MySQL DB上进行数千次并发写入的任何想法吗?
答案 0 :(得分:4)
写缩放是一个难题。也许,写缩放的秘诀在于读取缩放。也就是说,缓存尽可能多地读取,以便写入获得所有吞吐量。
话虽如此,有很多事情可以做:
1)从数据模型开始。设计数据模型,以便您不会删除或更新表。只有操作才是插入。使用生效日期,有效序列和有效状态仅使用插入命令实现插入,更新和删除操作。此概念称为“仅附加”模型。 Checkout RethinkDB ..
2)将“并发插入”标志设置为1.这样可确保在读取过程中表格继续插入。
3)如果尾部只有Inserts,则可能不需要行级锁定。所以,使用MyISAM(这不是要从InnoDB中取出任何东西,我将在稍后介绍)。
4)如果所有这些都不起作用,请在Memory Engine中创建一个副本表。如果您有一个名为MY_DATA的表,请在内存表中创建一个名为MY_DATA_MEM的表。
5)将所有插入重定向到MEM表。创建UNIONS两个表并将该视图用作读取源的视图。
6)编写一个守护进程,定期将MEM内容移动到Main表并从Mem表中删除。在Mem表上实现MOVE操作作为Delete触发器可能是理想的(我希望在Memory Engine上可以触发,但不完全确定)。
7)不要在MEM表上做任何删除或更新(它们很慢)也要注意表中键的基数(HASH vs B-Tree:Low Card - > Hash,High Card- > B-Tree)
8)即使以上所有方法都不起作用,也请忽略jdbc / odbc。转移到InnoDB并使用Handler Socket接口进行直接插入(Google for Yoshinori-San MySQL)
我自己没有使用HS,但基准测试令人印象深刻。 Google Code上有一个甚至Java HS项目。
希望有所帮助..