事务级别隔离如何影响MySQL中自动提交模式的性能?

时间:2010-04-27 06:52:59

标签: php mysql transactions vbulletin

我的服务器上运行了一个VBulletin 4.x论坛。根据{{​​3}},出于性能原因,一些论坛表被转换为InnoDB。论坛本身根本不使用事务(源代码中没有START TRANSACTION或BEGIN WORK),而InnoDB表仅用于防止表锁定UPDATE查询。论坛当然以自动提交模式运行。

我是否理解正确,在这种情况下我可以将默认服务器事务隔离级别更改为 READ UNCOMMITED 并以这种方式获得一些性能提升?

2 个答案:

答案 0 :(得分:1)

TL; DR:如果你的论坛很慢,那么TRANSACTION ISOLATION LEVEL很可能不是它的原因,并将其设置为除默认值之外的其他任何东西都无济于事。设置innodb_flush_log_on_trx_commit = 2会有所帮助,但会对崩溃产生持久性影响。

长版:

我在http://mysqldump.azundris.com/archives/77-Transactions-An-InnoDB-Tutorial.html中写了什么交易隔离级别。查看http://mysqldump.azundris.com/categories/32-InnoDB中的所有3篇InnoDB概述文章。

结果是,无论如何系统必须能够ROLLBACK,所以甚至READ UNCOMMITTED也不会改变写入时需要完成的任何事情。

对于读取事务,当导致读取事务视图的撤消日志记录链较长时,读取速度较慢,因此READ UNCOMMITTED或READ COMMITTED可能比默认的REPEATABLE READ快一点。但是你必须要记住,我们在这里谈论内存访问,而且磁盘访问会降低你的速度。

关于AUTOCOMMIT:这会将每个写入语句同步到磁盘。如果您之前一直在使用MyISAM并且这已经足够好了,您可能需要配置

[mysqld]
innodb_flush_log_on_trx_commit = 2
在my.cnf文件中

并重启服务器。

这将使提交从mysqld写入文件系统缓冲区缓存,但延迟将文件系统缓冲区缓存刷新到磁盘,以便它每秒只发生一次。您不会丢失有关mysqld崩溃的任何数据,但在硬件崩溃时您可能会丢失高达1s的写入数据。即使在硬件崩溃之后,InnoDB也会自动恢复,并且之前的行为仍然比MyISAM更好,即使它不是完整的ACID。如果没有这个设置,它将比AUTOCOMMIT快得多。

答案 1 :(得分:0)

即可。它肯定会带来一些性能提升。但是,如果您正在进行任何更新,则必须手动执行提交。

我对AutoCommit模式的了解是,它将在数据库操作之后自动执行提交,这会导致表上的索引在每次提交时重建,从而降低性能。