码迷,mamicode.com
首页 > 数据库 > 详细

优化InnoDB的只读事务

时间:2014-08-10 15:30:50      阅读:256      评论:0      收藏:0      [点我收藏+]

标签:blog   使用   io   数据   for   art   ar   cti   

     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

优化InnoDB的只读事务

标签:blog   使用   io   数据   for   art   ar   cti   

原文地址:http://www.cnblogs.com/sysman/p/3902851.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!