如何优化MySQL数据库以提高写入性能?

4

我有一个在EC2上运行的写入密集型应用程序。有什么想法可以优化它,使其能够在MySQL数据库上进行数千个并发写入?


数据太少了。为什么要进行优化?瓶颈在哪里?EC2的类型是什么?为什么不使用EBS卷? - Lex
需要优化的地方是瓶颈:需要同时在注册中进行数千次写入。我们正在使用EBS作为Web服务器,但是使用RDS作为数据库。 - user449914
嗯,为什么不将注册请求排队,并有后台进程将它们插入到RDS中呢? - Rodney Quillo
1个回答

6
写扩展是个难题。也许,写扩展的秘密在于读扩展。也就是说,尽可能缓存读取操作,这样写操作就可以获得全部吞吐量。
话虽如此,还是有一些可以做的事情:
1)从数据模型开始。设计数据模型,使您永远不必删除或更新表。唯一的操作是插入。使用有效日期(Effective Date)、有效序列(Effective Sequence)和有效状态(Effective Status)来实现插入、更新和删除操作,只需使用插入命令即可。这个概念被称为“追加模式”。查看 RethinkDB..。
2)将并发插入标志设置为 1。这可以确保在进行读取时表格保持插入状态。
3)当您只在末尾进行插入时,您可能不需要行级锁定。因此,请使用 MyISAM(这并不是要从 InnoDB 中取走任何东西,我稍后会解释)。
4)如果所有这些都没有产生太大的作用,请在 Memory Engine 中创建一个副本表。如果您有一个名为 MY_DATA 的表,请创建一个名为 MY_DATA_MEM 的内存表。
5)将所有插入重定向到 MEM 表。创建一个联合两个表的视图,并将该视图用作您的读取源。
6)编写一个守护进程,定期将 MEM 内容移动到主表中,并从 Mem 表中删除。最好将 MOVE 操作实现为 Mem 表上的删除触发器(我希望内存引擎上可以使用触发器,但不完全确定)。
7)不要在 MEM 表上进行任何删除或更新操作(它们很慢),同时注意您的表中键的基数(HASH vs B-Tree:低基数 -> Hash,高基数 -> B-Tree)。
8)即使所有上述方法都不起作用,也应该放弃 jdbc/odbc。转向 InnoDB,并使用 Handler Socket 接口进行直接插入(Google 搜寻 Yoshinori-San MySQL)。
我自己没有使用 HS,但基准测试结果令人印象深刻。甚至在 Google Code 上有一个 Java HS 项目。
希望这对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接