优化InnoDB的只读事务
时间:2022-03-13 22:41
InnoDB存储引擎可以避免read-only的事务写transaction id(trx_id属性)的开销。transaction id只有在一个事务
中有写操作或者上了写锁的事务(比如select ...for update)中才需要.不写transaction id能大大降低MySQL查询或者DML
语句建立快照的数据结构的大小。
现阶段,InnoDB在如下情况下会检测到只读事务:
- 当使用start transaction read only开始一个事务的时候。在这种情况下,如果试图修改数据,数据库(InnoDB,
MyISAM或者其他类型)就会报错。但是在这种情况下仍然可以修改跟session相关的临时表或者为这些临时表上锁
,因为这些修改或者锁对其他事务是不可见的。mysql> start transaction read only; Query OK, 0 rows affected (0.00 sec) mysql> insert into innodb(name) value ("read-only"); ERROR 1792 (25006): Cannot execute statement in a READ ONLY transaction.
- 当autocommit配置被打开的时候。在这种状态下事务会在单句中提交,并且组成这个事务的单个语句应该是一个
不加锁的select语句。也就是说这条sql语句不能包含 FOR UPDATE或者 LOCK IN SHARE MODE - 如果一个事务没有使用start transaction read only来启动,但是该事务中还没有执行修改语句的时候。只有当update
语句或者语句明确要求上锁的时候,才会建立transaction id。
因此,对于读密集型的应用(比如报表生成),可以通过把一系列查询语句放到start transaction read only和commit之间。或者
把autocommit配置打开。或者可以简单的通过不要在查询语句中间穿插dml语句来提高性能。
优化InnoDB的只读事务,布布扣,bubuko.com