14.13.14 InnoDB의 읽기 전용 트랜잭션 최적화
MySQL 5.6.4의 시점에서는 InnoDB
는 읽기 전용임을 알고있다 트랜잭션의 트랜잭션 ID ( TRX_ID
필드)의 설정에 관련된 오버 헤드를 피할 수 있습니다. 트랜잭션 ID는 쓰기 작업 또는 잠금 읽기 ( SELECT ... FOR UPDATE
등)을 수행 할 수있는 트랜잭션 에만 필요합니다. 불필요한 트랜잭션 ID를 삭제하면 쿼리 나 DML 문에 의해 읽기 뷰 가 구축 될 때마다 참조되는 내부 데이터 구조의 크기가 감소됩니다.
현재 InnoDB
는 다음과 같은 경우에 읽기 전용 트랜잭션을 검색합니다.
트랜잭션이
START TRANSACTION READ ONLY
문에서 시작 된 경우. 이 경우 데이터베이스 (InnoDB
,MyISAM
또는 기타 유형의 테이블)에 대해 변경을 시도하면 오류가 발생하여 트랜잭션이 읽기 전용 상태가됩니다.ERROR 1792 (25006) : Can not execute statement in a READ ONLY transaction.
그러나 읽기 전용 트랜잭션에서 세션 별 임시 테이블을 변경하거나 그 테이블에 대한 잠금 쿼리의 발행은 그 변경이나 잠금이 다른 어떤 트랜잭션도 표시되지 않기 때문에 계속 가능합니다.
autocommit 설정이 켜져 있기 때문에 트랜잭션이 하나의 문임을 보장 트랜잭션을 구성하는 하나의 문이 "비 록」의
SELECT
문이 있다면. 즉,FOR UPDATE
또는LOCK IN SHARED MODE
절을 사용하지 않는SELECT
입니다.
따라서 보고서 생성기 등의 읽기가 많은 애플리케이션의 경우, InnoDB
의 쿼리를 START TRANSACTION READ ONLY
및 COMMIT
내부에 그룹화하거나 SELECT
문을 실행하기 전에 autocommit
설정을 선택하거나 단순히 어떤 DML 문에 쿼리가 포함되지 않도록함으로써 그 쿼리의 순서를 조정할 수 있습니다.
START TRANSACTION
및 autocommit
내용은 섹션 13.3.1 "START TRANSACTION, COMMIT 및 ROLLBACK 구문" 을 참조하십시오.
자동 커밋 비 잠금 및 읽기 전용 (AC-NL-RO)로 승인 된 트랜잭션은 InnoDB
의 특정 내부 데이터 구조에서 제외되므로 SHOW ENGINE INNODB STATUS
의 출력에 표시되지 않습니다. 이러한 트랜잭션은 정보 스키마에서만 표시됩니다.