我有简单的数据库,有4个表,每个表有几百万行,还有几个索引。我每分钟执行几百次更新并插入它们。读取的频率要低得多,但它们需要快速 - 对于Web应用程序。读取应该具有优先级 - 如果它有助于改善阅读的快速性,我可以延迟写入。
目前,当我没有编写插入和更新时,选择所有嗡嗡声很好。当我在同一时间写作时,事情可能会变慢 - 有时是大规模的。服务器肯定会受到IO限制 - 我已经使用了iostat,在高速写入期间看到了99%的磁盘整合。
明天我将尝试剪切一两个索引,缩小行大小,并禁用查询缓存。有没有人对如何针对大量写入和少量读取调整表或mysql本身有任何其他建议?
这些表当前设置为使用带有紧凑行的innodb引擎,并且除缓冲池大小外,大多数配置仍设置为默认值。数据库将继续快速增长,因此将其全部置于ram中是不可取的。
更新:它在slicehost.com上 - 1gb ram,raid 10。
答案 0 :(得分:1)
索引会降低写入速度,但是读取性能是必需的,因此您可以尽可能少地支持读取。你的clustered index会导致很多减速吗?
另一种可能性是从单独的数据库/表中读取您的写入并选择最终的一致性 - 在您的情况下可能无法实现。
答案 1 :(得分:1)
要考虑的一件事(来自许多人)是使用交易。如果您可以在一个事务下捆绑多个写操作,则应该减少磁盘访问次数。
答案 2 :(得分:1)
不幸的是,MySQL通常是为80/20读/写比而构建的。我不知道你能做多少。
您使用的是交易吗?
如果您选择的数据通常不会受到写入影响(因此在进行修改时在写入时修改它不会影响写入性能),您可以在写入时将其外部化,例如:在交易结束时。
答案 3 :(得分:1)
我认为你需要考虑分区。这几乎是扩展写入的唯一方法。 MySQL从5.1开始就有native support,但也很可能推出自己的解决方案。后者要复杂得多,所以如果可能,我建议使用内置支持。但是,考虑到过多的写入负载,可能还不够。但是,如果不知道数据的结构如何,很难给出更详细的建议。
答案 4 :(得分:0)
我建议您通过设置mysql主从配置来进行写/读拆分。
您写入主服务器并将读取重定向到从服务器。
分裂本身可以通过两种方式完成
答案 5 :(得分:0)
如果MySQL支持索引填充因子,那么这将是一个值得关注的领域。不幸的是,版本5不支持填充因子(显然它位于版本6.x的feature request列表中)。
删除任何未使用的索引,并限制索引的宽度会有所帮助。
检查服务器有多少内存。
是否有磁盘RAID?
答案 6 :(得分:0)
您已经做了一些有用的事情(索引更少,数据类型更小)
innodb_buffer_pool_size
应该是可用RAM的大约70%。 (在旧版本中,默认值为太低。)但是对于您的 tiny 服务器(1GB RAM),150M可能太大。考虑增加内存。innodb_flush_log_at_trx_commit = 2
-速度更快,但数据安全性较低WHERE DATE(col) = '2019-01-01'
还有很多其他技巧,但是最好看看最糟糕的查询,再加上SHOW CREATE TABLE
。