如何针对大量写入和少量读取(100:1)优化/调整mysql。阅读perf reqd

时间:2009-06-14 14:14:49

标签: mysql performance optimization innodb

我有简单的数据库,有4个表,每个表有几百万行,还有几个索引。我每分钟执行几百次更新并插入它们。读取的频率要低得多,但它们需要快速 - 对于Web应用程序。读取应该具有优先级 - 如果它有助于改善阅读的快速性,我可以延迟写入。

目前,当我没有编写插入和更新时,选择所有嗡嗡声很好。当我在同一时间写作时,事情可能会变慢 - 有时是大规模的。服务器肯定会受到IO限制 - 我已经使用了iostat,在高速写入期间看到了99%的磁盘整合。

明天我将尝试剪切一两个索引,缩小行大小,并禁用查询缓存。有没有人对如何针对大量写入和少量读取调整表或mysql本身有任何其他建议?

这些表当前设置为使用带有紧凑行的innodb引擎,并且除缓冲池大小外,大多数配置仍设置为默认值。数据库将继续快速增长,因此将其全部置于ram中是不可取的。

更新:它在slicehost.com上 - 1gb ram,raid 10。

7 个答案:

答案 0 :(得分:1)

索引会降低写入速度,但是读取性能是必需的,因此您可以尽可能少地支持读取。你的clustered index会导致很多减速吗?

另一种可能性是从单独的数据库/表中读取您的写入并选择最终的一致性 - 在您的情况下可能无法实现。

答案 1 :(得分:1)

要考虑的一件事(来自许多人)是使用交易。如果您可以在一个事务下捆绑多个写操作,则应该减少磁盘访问次数。

答案 2 :(得分:1)

不幸的是,MySQL通常是为80/20读/写比而构建的。我不知道你能做多少。

您使用的是交易吗?

如果您选择的数据通常不会受到写入影响(因此在进行修改时在写入时修改它不会影响写入性能),您可以在写入时将其外部化,例如:在交易结束时。

答案 3 :(得分:1)

我认为你需要考虑分区。这几乎是扩展写入的唯一方法。 MySQL从5.1开始就有native support,但也很可能推出自己的解决方案。后者要复杂得多,所以如果可能,我建议使用内置支持。但是,考虑到过多的写入负载,可能还不够。但是,如果不知道数据的结构如何,很难给出更详细的建议。

答案 4 :(得分:0)

我建议您通过设置mysql主从配置来进行写/读拆分。

您写入主服务器并将读取重定向到从服务器。

分裂本身可以通过两种方式完成

  1. 使用代理(MySQL Proxy,Continuent / Sequoia,..)
  2. 在您的应用程序中自行拆分

答案 5 :(得分:0)

如果MySQL支持索引填充因子,那么这将是一个值得关注的领域。不幸的是,版本5不支持填充因子(显然它位于版本6.x的feature request列表中)。

  • 删除任何未使用的索引,并限制索引的宽度会有所帮助。

  • 检查服务器有多少内存。

  • 是否有磁盘RAID?

答案 6 :(得分:0)

您已经做了一些有用的事情(索引更少,数据类型更小)

  • innodb_buffer_pool_size应该是可用RAM的大约70%。 (在旧版本中,默认值为太低。)但是对于您的 tiny 服务器(1GB RAM),150M可能太大。考虑增加内存。
  • 如果要交换,请获取更多RAM或降低更多设置。
  • 考虑innodb_flush_log_at_trx_commit = 2 -速度更快,但数据安全性较低
  • 批处理插入-单个查询中100个插入将比100个单行插入快10倍。
  • 看看规范化或非规范化
  • 检查是否在函数调用中隐藏索引列:WHERE DATE(col) = '2019-01-01'
  • 使用慢速日志来识别最顽皮的查询-它们可以被写入读取。
  • 我是否建议增加RAM?

还有很多其他技巧,但是最好看看最糟糕的查询,再加上SHOW CREATE TABLE