当我只运行写入查询(插入,删除,更新)时,我有一个master数据库
我想知道如何调整这一点,因为选择在这里并不重要。
我使用的是InnoDB。使用1个主服务器和2个从服务器进行复在Ubuntu 16.04服务器上运行。 MySQL 5.6
答案 0 :(得分:4)
停用query cache。它只对读取有益。
停用adaptive hash index。它只对读取有益。
增加innodb_log_file_size。我建议至少2GB,除非磁盘空间不足。
删除索引,但UPDATE
/ DELETE
语句使用的索引除外。您可以在从属服务器上创建更多索引以支持SELECT
查询。
考虑fine-tuning the Buffer Pool Flushing。最佳设置取决于您的工作量,因此您必须进行实验。
如果您想牺牲耐久性,可以进行一些其他更改。警告:这会增加数据丢失的风险。
innodb_flush_log_at_trx_commit = 2或0以放松同步日志写入。
innodb_doublewrite = OFF以禁用页面写保护。
sync_binlog = 0表示禁用对二进制日志的同步写入。
确保您的数据目录位于快速磁盘上,如SSD或缓存RAID阵列。
永远不要使用NFS。
您可以尝试将innodb_log_group_home_dir和innodb_undo_directory以及log_bin_basename和tmpdir放在数据目录中的不同物理卷上。但是,除非性能真的受到磁盘限制,否则这不会带来好处。
进一步调整取决于您的工作量。例如,更改线程并发性或IO写入线程数或IO容量。如果你想进入这个级别的调整,请咨询专业人士。
来自@ spencer7593的评论提出了一个很好的观点,您可能无法仅通过数据库调优选项实现最佳优化。
您没有提及有关应用程序或写入类型的任何内容,但最终您必须考虑更改写入数据库的方式。单独调整更改仅限于提高数据库性能的方式。
例如,应用程序可以写入队列,然后创建消费者应用程序以使用队列中的项目并以较大批量将数据写入数据库。这意味着更高效的数据库写入,但更重要的是,它允许应用程序以更低的延迟“写入”,因为它们只是写入队列。
最终,您可能会发现没有一个数据库实例可以跟上写入速度。此时,您必须通过在多个数据库实例上传播写入来扩展。这称为“分片”数据。当然,这会增加数据库读取的复杂性,因为您的数据并非全部在一起。因此,在尝试分片之前,请尝试所有可以尝试的调整更改。