2

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

目前,当我不编写插入和更新时,选择都很好。当我同时写作时,事情可能会变慢 - 有时会很慢。服务器肯定会受到 IO 限制——我使用 iostat 并看到在高写入期间磁盘单元化率为 99%。

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

这些表当前设置为使用具有紧凑行的 innodb 引擎,并且除了缓冲池大小之外,大多数配置仍设置为默认值。db 将继续快速增长,因此不能将其全部放在 ram 中。

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

4

7 回答 7

1

索引会减慢写入速度,但对于读取性能是必需的,因此您可以使用尽可能少的索引来支持读取。您的聚集索引是否会导致速度变慢?

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

于 2009-06-14T14:21:09.617 回答
1

要考虑的一件事(很多)是使用事务。如果您可以将多个写入操作捆绑在一个事务中,则应该会降低磁盘访问次数。

于 2009-06-14T14:21:09.773 回答
1

不幸的是,MySQL 通常是为 80/20 的读/写比率而构建的。不知道有没有很多可以做的。

你在使用交易吗?

如果您选择的数据不经常受到写入的影响(这样在有修改时在写入时对其进行修改不会影响写入性能),您可以在写入时将其外部化,例如在事务结束时。

于 2009-06-14T14:24:23.993 回答
1

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

于 2009-06-14T14:47:29.587 回答
0

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

您写入主设备并将读取重定向到从设备。

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

  1. 使用代理(MySQL 代理、Continuent/Sequoia、..)
  2. 在您的应用程序中自己进行拆分
于 2009-06-14T14:20:37.637 回答
0

如果 MySQL 支持索引填充因子,那将是一个值得关注的领域。不幸的是,第 5 版不支持填充因子(显然它在 6.x 版的功能请求列表中)。

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

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

  • 磁盘 RAID 了吗?

于 2009-06-14T14:24:22.310 回答
0

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

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

还有很多其他提示,但最好看到最糟糕的查询,加上SHOW CREATE TABLE.

于 2019-07-24T18:22:40.540 回答