写扩展是个难题。也许,写扩展的秘密在于读扩展。也就是说,尽可能缓存读取操作,这样写操作就可以获得全部吞吐量。
话虽如此,还是有一些可以做的事情:
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 项目。
希望这对您有所帮助。