8.5.3 优化InnoDB只读事务

InnoDB通过检测只读事务来避免为非写入操作设置事务ID,从而降低开销。只读事务在starttransactionwithreadonly启动或autocommit开启下非锁定select语句时被识别。这种方法适用于读取密集型应用,如报表生成,可通过STARTTRANSACTIONREADONLY和COMMIT之间的查询分组或打开autocommit来优化查询性能。
摘要由CSDN通过智能技术生成

InnoDB可以避免为只读事务设置事务ID(TRX_ID字段)带来的开销,事务ID仅仅被需要于可能执行写入操作或者锁定读取(select ... for update)的事务。消除不必要的事务ID可以减少在每次查询或数据更改语句构造读取视图时需要查询的内部数据结构的大小。

InnoDB 在以下情况下检测只读事务:

  • 由start transaction with read only的语句启动的事务。在这种情况下,尝试修改数据库(InnoDB,MyISAM或其他类型的表)会导致一个错误,事务会继续处于只读状态:
ERROR 1792 (25006): Cannot execute statement in a READ ONLY transaction.
  • autocommit设置是打开的,所以事务内保证是单个语句,并且这个语句是一个非锁定的select语句。也就是说:一个没有使用for update 或LOCK in SHARED MODE 的select语句。
    • 解释:autocommit 设置打开并且 select 语句没有用 for update 或者 LOCK IN SHARED MODE 
  • 事务启动时没有READ ONLY 参数(START TRANSACTION),但是还没有执行显示锁定行或者更新语句。在需要更新或者显示锁之前,事务保持只读模式。

因此,对于读取密集型应用,比如报表生成器,你可以调优一系列的innoDB查询,通过将这些语句分组在 START TRANSACTION READ ONLY 和 COMMIT之间,或者在运行select语句之前将autocommit设置打开,或者简单的避免在查询中混合任何数据更改语句。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值