InnoDB瓶颈:放宽ACID以提高性能

时间:2012-05-05 01:44:14

标签: mysql innodb myisam database-performance

在注意到我们的数据库已成为我们的实时生产系统的主要瓶颈之后,我决定构建一个简单的基准来解决问题的根源。

基准测试:我计算在InnoDB表中增加相同行3000次所需的时间,其中行由其主键索引,并且正在更新的列不是任何索引的一部分。我使用在远程计算机上运行的20个并发客户端执行这3000次更新,每个客户端都有自己与数据库的单独连接。

我有兴趣了解为什么我对基准测试的不同存储引擎InnoDB,MyISAM和MEMORY拥有他们所做的配置文件。我也希望明白为什么InnoDB相比之差很小。

InnoDB(20个并发客户端): 每次更新需要0.175秒。 所有更新都在6.68s之后完成。

MyISAM(20个并发客户端): 每次更新需要0.003秒。 所有更新都在0.85秒后完成。

内存(20个并发客户端): 每次更新需要0.0019秒。 所有更新都在0.80秒后完成。

认为并发可能导致此行为,我还对单个客户端进行基准测试,并按顺序执行100次更新。

InnoDB的: 每次更新需要0.0026秒。

的MyISAM: 每次更新需要0.0006秒。

MEMORY: 每次更新需要0.0005秒。

实际的机器是Amazon RDS实例(http://aws.amazon.com/rds/),主要是默认配置。

我猜测答案将是以下几行:每次更新后InnoDB fsyncs(因为每次更新都是符合ACID的事务),而MyISAM则没有,因为它甚至不支持事务。 MyISAM可能正在内存中执行所有更新,并定期刷新到磁盘,这是它的速度接近MEMORY存储引擎的方式。如果是这样,有没有办法使用InnoDB来支持它的事务,但是可能会放松一些约束(通过配置),以便以一定的持久性为代价更快地完成写入?

此外,有关如何提高InnoDB性能的建议随着客户数量的增加而增加?它显然比其他存储引擎更糟糕。

更新

我找到https://blogs.oracle.com/MySQL/entry/comparing_innodb_to_myisam_performance,这正是我所寻找的。设置innodb-flush-log-at-trx-commit = 2允许我们在出现电源故障或服务器崩溃的情况下放松ACID约束(每秒刷新一次磁盘)。这给了我们与MyISAM类似的行为,但我们仍然可以从InnoDB中提供的事务功能中受益。

运行相同的基准测试,我们发现写入性能提高了10倍。

InnoDB(20个并发客户端): 每次更新需要0.017秒。 所有更新都在0.98秒之后完成。

还有其他建议吗?

2 个答案:

答案 0 :(得分:6)

我找到https://blogs.oracle.com/MySQL/entry/comparing_innodb_to_myisam_performance,这正是我所寻找的。设置innodb-flush-log-at-trx-commit = 2允许我们在出现电源故障或服务器崩溃的情况下放松ACID约束(每秒刷新一次磁盘)。这给了我们与MyISAM类似的行为,但我们仍然可以从InnoDB中提供的事务功能中受益。

运行相同的基准测试,我们发现写入性能提高了10倍。

InnoDB(20个并发客户端):每次更新需要0.017秒。所有更新都在0.98秒之后完成。

答案 1 :(得分:5)

我们在应用程序中完成了一些类似的测试,我们注意到如果没有显式打开事务,则在事务中处理每个单独的SQL指令,这需要更多的时间来执行。如果您的业务逻辑允许,您可以在事务块中放置几个​​SQL命令,从而减少总体ACID开销。在我们的案例中,我们通过这种方法获得了很大的性能提升。