文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  优化 InnoDB 只读事务

10.5.3  优化 InnoDB 只读事务

InnoDB 可以避免与设置已知为只读的事务的 事务 ID (TRX_ID 字段) 相关的开销。事务 ID 仅对于可能执行写入操作或 锁定读取(例如 SELECT ... FOR UPDATE)的事务才需要。消除不必要的事务 ID 会减小每次查询或数据更改语句构造 读取视图 时所查询的内部数据结构的大小。

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

  • 事务使用 START TRANSACTION READ ONLY 语句启动。在这种情况下,尝试对数据库进行更改(对于 InnoDBMyISAM 或其他类型的表)会导致错误,并且事务将继续处于只读状态

    ERROR 1792 (25006): Cannot execute statement in a READ ONLY transaction.

    您仍然可以在只读事务中对特定于会话的临时表进行更改,或者为它们发出锁定查询,因为这些更改和锁对于任何其他事务都是不可见的。

  • autocommit 设置已打开,因此保证事务是单个语句,并且构成事务的单个语句是 非锁定 SELECT 语句。也就是说,不使用 FOR UPDATELOCK IN SHARED MODE 子句的 SELECT

  • 事务是在没有 READ ONLY 选项的情况下启动的,但尚未执行任何更新或显式锁定行的语句。在需要更新或显式锁之前,事务将保持只读模式。

因此,对于像报表生成器这样的读密集型应用程序,您可以通过将一系列 InnoDB 查询分组在 START TRANSACTION READ ONLYCOMMIT 之间,或在运行 SELECT 语句之前打开 autocommit 设置,或简单地避免在查询之间插入任何数据更改语句来调整一系列 InnoDB 查询。

有关 START TRANSACTIONautocommit 的信息,请参见 第 15.3.1 节,“START TRANSACTION、COMMIT 和 ROLLBACK 语句”

注意

符合自动提交、非锁定和只读 (AC-NL-RO) 的事务将被排除在某些内部 InnoDB 数据结构之外,因此不会在 SHOW ENGINE INNODB STATUS 输出中列出。