优化InnoDB只读事务
InnoDB
可以避免与为已知为只读的事务设置事务ID(TRX_ID
字段)相关的开销。事务ID仅对于可能执行写操作或锁定读取的事务(例如)需要。消除不必要的事务ID可以减少每次查询或数据更改语句构造一个读取视图时都要查询的内部数据结构的大小。SELECT ... FOR UPDATE
InnoDB
在以下情况下检测到只读事务:
事务从
START TRANSACTION READ ONLY
语句开始。在这种情况下,尝试对数据库(针对InnoDB
,MyISAM
或其他类型的表)进行更改会导致错误,并且事务将继续以只读状态运行:ERROR 1792 (25006): Cannot execute statement in a READ ONLY transaction.
您仍然可以在只读事务中对特定于会话的临时表进行更改,或对其发出锁定查询,因为这些更改和锁定对于任何其他事务都不可见。
utocommit
启用了该设置,以确保事务是单个语句,组成事务的单个语句是“非锁定”SELECT
语句。也就是说,SELECT
不使用FOR UPDATE
orLOCK IN SHARED MODE
子句的a。- 事务在没有该
READ ONLY
选项的情况下启动,但是尚未执行任何显式锁定行的更新或语句。在需要更新或显式锁之前,事务将保持只读模式。
因此,对于诸如报表生成器之类的读取密集型应用程序,您可以InnoDB
通过在START TRANSACTION READ ONLY
和中对它们进行分组来调整查询序列COMMIT
,或者 utocommit
在运行SELECT
语句之前打开设置,或者简单地避免任何数据更改语句散布在查询中,从而优化查询序列。。
有关信息START TRANSACTION
,并 utocommit
请参见 13.3.1节,“START TRANSACTION,COMMIT和ROLLBACK语句”。
符合自动提交,非锁定和只读(AC-NL-RO)的事务会保留在某些内部InnoDB
数据结构之外,因此不会在SHOW ENGINE INNODB STATUS
输出中列出。