mysql - 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
谢谢!
解决方案
直观地说,约束数据库访问操作执行通常意味着性能下降。
抱歉,在这种情况下,您的直觉不能很好地为您服务。
隔离级别应该对查询执行性能没有显着影响,并且您不应该选择隔离级别来“获得更好的性能”。它们会影响某些查询的锁定行为,这仅在您有需要获取锁的并发查询时才重要。
根据隔离级别,如果另一个会话持有锁,他们可能必须等待锁。查询在获得所需的锁之前不会开始执行时间。
如果您查看过 MySQL 慢查询日志,您可能已经注意到它Query_time
与Lock_time
. 在一个看起来很慢的系统中,即使平均查询时间非常短,也可能是这样,但查询必须在队列中等待才能获取锁。
一旦获得所需的锁,查询在一个隔离级别上的执行速度与在另一个级别上一样快。
PS:我从来没有找到任何使用 READ_UNCOMMITTED 隔离级别的好理由。允许会话查看来自其他会话的部分完成的更改只是一个坏主意。它打破了原子更改的保证。
推荐阅读
- html - 分页类未在 html 中应用
- robotframework - 如何在 Robot Framework 中的循环中执行循环
- android - 用户从 Android 应用中选择日期/时间后在日历中设置提醒
- php - Cycle 没有显示 SQL 中显示的所有结果
- sql - 当oracle中特定周不存在数据时如何将值填充为零
- java - Mocktio 可以模拟持久性提供程序,以便 jenkins(或其他管道工具)可以在没有数据库的情况下执行 JUnit 测试吗?
- pentaho - 无法从数据库结果集中获取值 'String(34)',索引 2
- php - 在 REST API 中搜索特定 id
- css - 如何在引导程序中设置下拉项的宽度?
- vue.js - 无法从选项列表中选择选项