Loading...
MySQL 9.5 Reference Manual 9.5의 10.5.3 Optimizing InnoDB Read-Only Transactions의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
InnoDB는 읽기 전용임이 알려진 트랜잭션에 대해 transaction ID(TRX_ID 필드)를 설정하는 데 수반되는 오버헤드를 피할 수 있습니다. transaction ID는 쓰기 작업이나 SELECT ... FOR UPDATE와 같은 locking reads를 수행할 수 있는 transaction에만 필요합니다. 불필요한 transaction ID를 제거하면, 쿼리나 데이터 변경 문장이 read view를 구성할 때마다 조회되는 내부 데이터 구조의 크기가 줄어듭니다.
InnoDB는 다음과 같은 경우에 읽기 전용 트랜잭션을 감지합니다:
트랜잭션이 START TRANSACTION READ ONLY 문으로 시작된 경우. 이 경우 데이터베이스(InnoDB, MyISAM 또는 다른 유형의 테이블)에 변경을 시도하면 오류가 발생하며, 트랜잭션은 읽기 전용 상태로 계속됩니다:
ERROR 1792 (25006): Cannot execute statement in a READ ONLY transaction.
여전히 읽기 전용 트랜잭션에서 세션 전용 임시 테이블을 변경하거나 그들에 대해 잠금 쿼리를 실행할 수 있습니다. 왜냐하면 그러한 변경과 잠금은 다른 어떤 트랜잭션에서도 볼 수 없기 때문입니다.
autocommit 설정이 켜져 있어서 트랜잭션이 단일 문장임이 보장되고, 트랜잭션을 구성하는 단일 문장이 “non-locking” SELECT 문장인 경우. 즉, FOR UPDATE나 LOCK IN SHARED MODE 절을 사용하지 않는 SELECT입니다.
트랜잭션이 READ ONLY 옵션 없이 시작되었지만, 아직 업데이트나 명시적으로 행을 잠그는 문장이 실행되지 않은 경우. 업데이트나 명시적 잠금이 필요해질 때까지 트랜잭션은 읽기 전용 모드에 머무릅니다.
따라서 보고서 생성기와 같은 읽기 집약적인 애플리케이션의 경우, START TRANSACTION READ ONLY와 COMMIT으로 묶어서 InnoDB 쿼리 시퀀스를 튜닝하거나, SELECT 문을 실행하기 전에 autocommit 설정을 켜두거나, 단순히 쿼리 사이에 데이터 변경 문장을 끼워 넣지 않는 방식으로 튜닝할 수 있습니다.
START TRANSACTION 및 autocommit에 대한 정보는 Section 15.3.1, “START TRANSACTION, COMMIT, and ROLLBACK Statements”을 참조하십시오.
참고
auto-commit, non-locking, read-only (AC-NL-RO) 조건을 만족하는 트랜잭션은 특정 내부 InnoDB 데이터 구조 밖에 유지되므로, SHOW ENGINE INNODB STATUS 출력에 나열되지 않습니다.
10.5.2 Optimizing InnoDB Transaction Management
10.5.4 Optimizing InnoDB Redo Logging