• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 优化InnoDB只读事务

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

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

    • 事务从START TRANSACTION READ ONLY语句开始。在这种情况下,尝试对数据库(针对InnoDBMyISAM或其他类型的表)进行更改会导致错误,并且事务将继续以只读状态运行:

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

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

    • utocommit启用了该设置,以确保事务是单个语句,组成事务的单个语句是“非锁定”SELECT语句。也就是说,SELECT不使用FOR UPDATEor LOCK 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输出中列出。