12-07-InnoDB¶
Real MySQL 8.0 1 - 아키텍처
InnoDB¶
레코드 기반 잠금을 제공하여 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어나다.
- 프라이머리 키에 의한 클러스터링
- 프라이머리 키 값의 순서대로 디스크에 저장
- 세컨더리 인덱스는 레코드의 주소 대신 프라이머리 키의 값을 논리적인 주소로 사용
- 외래키 지원
- InnoDB 스토리지 엔진 레벨에서 지원하는 기능
- 외래 키는 부모 테이블과 자식 테이블 모두 해당 컬럼에 대한 인덱스 생성 필요
- 변견 시에 데이터 체크하는 작업으로 잠금이 여러 테이블로 전파되고 데드락 발생 주의 필요
- MVCC(Multi Version Concurrency Control)
- MVCC의 목적: 잠금을 사용하지 않는 일관된 읽기 제공
- 멀티 버전: 하나의 레코드에 대해 여러 개의 버전이 동시에 관리된다
- 언두 로그(Undo log)를 통해 구현
- 하나의 레코드에 대해 2개의 버전이 유지되고, 필요에 따라 어느 데이터가 보여지는지 여러 상황에 따라 달라지는 구조
- update 문장이 실행되면 버퍼 풀은 새로운 데이터로 변경되고 기존 데이터는 언두영역으로 복사
- 잠금 없는 일관된 읽기(Non-Locking Consistent Read)
- 격리 수준에 따라 읽기 작업은 다른 트랜잭션과 관계 없이 잠금을 대기하지 않고 바로 실행
- 변경 전의 데이터를 읽기 위해 언두 로그 사용
- 자동 데드락 감지
- 데드락 감지 스테드가 주기적으로 잠금 대기 그래프를 검사해 교착 상태에 빠진 트랜잭션 중 하나를 강제 종료
- 언두 로그 레코드를 적게 가진 트랜잭션이 롤백 대상
innodb_table_locks: 테이블 레벨의 잠금 감지 여부 변수innodb_deadlock_detect: 데드락 감지 스레드 활성화 변수 -> 데드락 감지 스레드가 성능을 저하시키는 경우 변경하여 성능 비교를 해보는 것도 좋음