【问题标题】:How do you optimize a MySQL database for writes?如何优化 MySQL 数据库的写入?
【发布时间】:2010-12-23 04:22:11
【问题描述】:

我有一个在 EC2 上运行的写入密集型应用程序。关于如何优化它以能够在 MySQL DB 上进行数千个并发写入的任何想法?

【问题讨论】:

  • 数据太少。为什么要优化?瓶颈在哪里? EC2 的类型是什么?为什么不使用 EBS 卷?
  • 在哪里优化=瓶颈:需要同时进行数千次注册。我们将 EBS 用于 Web 服务器,但 RDS 用于 DB
  • hmm..为什么不对注册请求进行排队,让后台进程将它们插入 RDS?

标签: mysql amazon-ec2


【解决方案1】:

写入缩放是一个难题。也许,写入缩放的秘诀在于读取缩放。也就是尽可能多的缓存读取,让写入得到所有的吞吐量。

话虽如此,有很多事情可以做:

1) 从数据模型开始。设计一个数据模型,以便您永远不会删除或更新表。唯一的操作是插入。使用生效日期、生效顺序和生效状态,仅使用插入命令即可实现插入、更新和删除操作。这个概念称为 Append Only 模型。结帐 RethinkDB..

2) 将并发插入标志设置为 1。这可确保在读取过程中表继续插入。

3) 当尾部只有 Insert 时,可能不需要行级锁。所以,使用 MyISAM(这不是要从 InnoDB 中拿走任何东西,我稍后会谈到)。

4) 如果这一切都没有多大作用,请在 Memory Engine 中创建一个副本表。如果您有一个名为 MY_DATA 的表,请在内存表中创建一个名为 MY_DATA_MEM 的表。

5) 将所有插入重定向到 MEM 表。创建一个合并两个表的视图并将该视图用作您的读取源。

6) 编写一个守护进程,定期将 MEM 内容移动到 Main 表并从 Mem 表中删除。将 MOVE 操作实现为 Mem 表上的 Delete 触发器可能是理想的(我希望在 Memory Engine 上可以使用触发器,但不完全确定)。

7) 不要对 MEM 表进行任何删除或更新(它们很慢)还要注意表中键的基数(HASH vs B-Tree : Low Card -> Hash, High Card-> B树)

8) 即使以上所有方法都不起作用,也要抛弃 jdbc/odbc。转移到 InnoDB 并使用 Handler Socket 接口进行直接插入(Google for Yoshinori-San MySQL)

我自己没有使用过 HS,但基准测试令人印象深刻。 Google Code 上还有一个 Java HS 项目。

希望对您有所帮助..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-20
    • 2010-12-12
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2011-01-23
    相关资源
    最近更新 更多