Choose a default theme

You can change your theme from the menu

InnoDB

InnoDB는 MySQL에서 행 저장, 인덱스, 트랜잭션과 동시성 제어를 담당하는 저장 엔진이다. 커밋과 롤백, 장애 복구, 다중 버전 동시성 제어를 제공한다. 여기서는 MySQL 8.4 문서를 기준으로 구조와 동작을 설명한다.

분야

트랜잭션 저장 엔진

클러스터형 인덱스

InnoDB의 테이블 데이터는 클러스터형 인덱스의 리프에 저장된다. 일반적으로 기본 키가 그 기준이 되므로 기본 키 설계는 행의 배치와 보조 인덱스 비용에도 영향을 준다. 기본 키가 없을 때 내부 식별자를 사용하는 경우도 있으므로 명시적인 키 설계를 생략해도 비용이 사라지는 것은 아니다.

MVCC와 undo

다중 버전 동시성 제어는 과거 시점에 해당하는 행을 읽을 수 있도록 버전 정보를 유지하는 방식이다. InnoDB는 undo 기록을 사용해 필요한 이전 버전을 구성한다. 따라서 일반적인 일관 읽기는 모든 읽기 대상 행에 배타적인 잠금을 걸지 않고도 일관된 모습을 볼 수 있다.

오래 열린 읽기 트랜잭션이 이전 버전을 필요로 하면 해당 undo의 정리가 지연될 수 있다. 현재 실행 중인 쿼리가 짧더라도 트랜잭션 자체가 오래 유지되는지 확인할 필요가 있다. undo는 롤백과 과거 버전 제공에 관계하며, 장애 복구를 위한 redo와 역할을 구별한다.

잠금은 인덱스 접근과 연결된다

레코드 잠금은 인덱스의 레코드에 걸린다. 갭 잠금은 인덱스 값 사이 구간에 대한 삽입을 제한하며, 넥스트키 잠금은 레코드와 그 앞 구간을 함께 다룬다. 따라서 SQL 문장이 논리적으로 몇 행을 수정하는지만으로 잠금 범위를 정확히 예측할 수 없다.

기본 REPEATABLE READ의 잠금 읽기와 범위 검색에서는 넥스트키 잠금이 중요한 역할을 한다. 반면 유일 키 전체에 대한 기존 행의 정확한 조회 등은 다른 범위를 잠글 수 있다. READ COMMITTED도 외래 키 검사와 중복 키 검사 같은 예외를 함께 고려해야 한다.

운영에서 살펴볼 항목

트랜잭션 시간, 잠금 대기와 교착 상태, undo 누적, 디스크 지연을 함께 살핀다. 교착 상태 이후 재시도는 트랜잭션 전체의 일관성을 유지하도록 설계한다. 엔진이 제공하는 ACID 특성과 실제 장애 시 데이터 보존 수준을 평가할 때는 로그 동기화 설정과 저장 장치 조건도 확인한다.

함께 읽기

MySQL · MyRocks

참고 자료