MySQL:速度超过可靠性配置

时间:2016-12-09 03:40:49

标签: mysql performance

对于我的开发机器,在发生崩溃时我不需要数据一致性。是否有类似Debian系统的配置,可以优化MySQL的速度(即使它牺牲了可靠性)?

类似于:缓存RAM中的最后1 GB。在使用1 GB之前,请勿用数据触摸磁盘。

4 个答案:

答案 0 :(得分:1)

您可以禁用许多InnoDB配置以确保持久性,但存在丢失数据风险增加的风险。但有时您希望在Running with scissors mode中操作数据库,因为原始数据安全地存储在其他位置,并且可以轻松地重新创建测试数据库中的副本。

此博客介绍了Reducing MySQL durability for testing。除了测试之外,您不会为了任何其他目的而看到任何正式的MySQL建议!

以下是您可以在/etc/my.cnf中进行的更改摘要:

[mysqld]
# log_bin (comment this out to disable the binary log)
# sync_binlog=0 (irrelevant if you don't use the binary log)
sync_frm=0
innodb_flush_log_at_trx_commit=0
innodb_doublewrite=0
innodb_checksums=0
innodb_support_xa=0
innodb_log_file_size=2048M # or more

他还建议增加innodb_buffer_pool_size,但大小取决于您的可用内存。

为了它的价值,我最近尝试在我为团队中的开发人员构建的默认Vagrant框中的配置中设置innodb_flush_log_at_trx_commit=0,但我不得不退出该更改,因为它导致了对于数据库损坏的开发人员来说,浪费了太多时间。只是值得深思。有时它不是一个很好的权衡。

这并不完全符合您的要求(将最后1GB的数据保留在RAM中),因为它仍然使用事务日志记录操作InnoDB,并且日志每秒刷新一次到磁盘。在MySQL中没有办法解决这个问题。

您可以尝试使用MyISAM,它使用缓冲写入数据和索引,并依赖于文件系统缓冲区。因此它可以缓存你的一些数据(实际上我发现缓冲区非常迅速地刷新到磁盘,因此你不可能在任何时候都有足够的1GB内存)。 MyISAM还有其他问题,例如缺乏对交易的支持。使用MyISAM进行开发,然后在生产中使用InnoDB可以为您带来一些尴尬的惊喜。

为了提高性能,您可以在MySQL会话中进行其他一些更改,但我不推荐这些更改,因为它可以改变您的应用程序行为。

set session unique_checks=0;
set session foreign_key_checks=0;

有些人建议使用MEMORY存储引擎。这有其自身的问题,如大小限制,表锁定和缺乏对事务的支持。

我还尝试过将表格或tmpdir放到tmpfs上,但我发现它并没有给你带来的性能提升。 RDBMS中的开销与磁盘I / O没有直接关系。

您可能还想尝试MyRocks,这是MySQL的一个版本,包括用于MySQL的RocksDB存储引擎。 Facebook开发并将其作为开源发布。见Facebook rocks an open source storage engine for MySQL(InfoWorld)。他们承诺减少I / O,压缩数据,并做其他整洁的事情。

但同样,让您的开发环境尽可能接近您的生产环境是一个很好的经验法则。使用不同的存储引擎会产生在代码到达生产之前不会发现一些错误的风险。

底线:调整MySQL并不是一个神奇的子弹。也许您应该考虑设计应用程序以更多地使用微服务,缓存和消息队列,并减少对直接SQL查询的依赖。

另外,我建议您始终为开发人员提供最快的基于SSD的工作站。在CPU和RAM以及磁盘速度上找到最重要的一行。

Mac Pro circa 2013

答案 1 :(得分:1)

正在进行什么样的查询?我的一句咒语:"你无法摆脱性能问题。"

这是加速InnoDB,wrt交易的一件事:

file1

有一种简单的方法可以将单行插入速度提高10倍。

一些'复合材料'索引可以将innodb_flush_log_at_trx_commit = 2 加速100倍。

重新制定SELECT有时可以将查询速度提高100倍。

答案 2 :(得分:1)

@Bill Karwin的答案提供了有用的mysql设置来提高性能。我已经全部使用它们,并且能够实现大约2倍的性能提升。

然而,对我的用例 - 重新加载mysql转储 - 给我带来最大性能提升(快近15倍)的原因是使用<key>CFBundleIconName</key> <string>AppIcon</string> 选项挂载底层文件系统(ext4)。 / p>

nobarriers

More info here

如果你在/ var / lib / mysql上安装了一个单独的分区(或逻辑卷),你应该只考虑这个,这样你就可以只为MySQL而不是整个系统进行权衡。

答案 3 :(得分:0)

虽然这个答案可能不完全符合您提出的问题,但请考虑使用var foo; var bar = 'defined'; try{ if(someVariable === 'undefined') { console.log('undefined'); //foo }else{ console.log('declare && defined'); //bar } }catch (e){ console.log('undeclared'); //undeclaredVariable } 引擎创建表格,如下所示:http://dev.mysql.com/doc/refman/5.7/en/memory-storage-engine.html

  

MEMORY引擎的典型用例涉及这些   特性:

     

涉及会话等瞬态非关键数据的操作   管理或缓存。当MySQL服务器停止或重新启动时,   MEMORY表中的数据丢失。

     

内存存储,可实现快速访问和低延迟。数据量可以适合   完全在内存中而不会导致操作系统换出   虚拟内存页面。

     

只读或主要读取数据访问模式(有限更新)。

试一试。

我的建议,即使是开发机器,也是使用默认的InnoDB。如果您选择进行交易,InnoDB会很有帮助。

此博客可以帮助您从tmpfs http://jotschi.de/2014/02/03/high-performance-mysql-testdatabase/运行MySQL。用户Jotschi也在SO answer #10692398

中谈到了这一点