首页 > 解决方案 > MySQL中transaction_isolation的性能

问题描述

我知道transaction_isolation有 4 个有效值:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE, 上面的顺序是从最高的一致性和保护量到最少的[Official Doc]

直观地说,约束数据库访问操作的执行通常意味着性能下降。此外,如此所述,READ-UNCOMMITTED应该是四者中性能最好的。

但是,我运行了一个测试:

./mysql-test-run.pl \
--debug-server \
--clean-vardir \
--force-restart \
--report-times \
--max-connections=16 \
--testcase-timeout=60 \
--combination=--transaction-isolation=SERIALIZABLE \
--combination=--transaction-isolation=REPEATABLE-READ \
--combination=--transaction-isolation=READ-COMMITTED \
--combination=--transaction-isolation=READ-UNCOMMITTED \
--repeat=100 \
main.innodb_deadlock

并得到以下结果(以毫秒为单位衡量的时间):导致性能最差。结果对吗?
在此处输入图像描述
READ-UNCOMMITTED

谢谢!

标签: mysqlperformanceisolation-level

解决方案


直观地说,约束数据库访问操作执行通常意味着性能下降。

抱歉,在这种情况下,您的直觉不能很好地为您服务。

隔离级别应该对查询执行性能没有显着影响,并且您不应该选择隔离级别来“获得更好的性能”。它们会影响某些查询的锁定行为,这仅在您有需要获取锁的并发查询时才重要。

根据隔离级别,如果另一个会话持有锁,他们可能必须等待锁。查询在获得所需的锁之前不会开始执行时间。

如果您查看过 MySQL 慢查询日志,您可能已经注意到它Query_timeLock_time. 在一个看起来很慢的系统中,即使平均查询时间非常短,也可能是这样,但查询必须在队列中等待才能获取锁。

一旦获得所需的锁,查询在一个隔离级别上的执行速度与在另一个级别上一样快。

PS:我从来没有找到任何使用 READ_UNCOMMITTED 隔离级别的好理由。允许会话查看来自其他会话的部分完成的更改只是一个坏主意。它打破了原子更改的保证。


推荐阅读