首页 > 代码库 > 优化InnoDB的只读事务
优化InnoDB的只读事务
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语句来提高性能。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。