CS/DataBase
(MySQL) MySQL 스토리지 엔진 아키텍처 - InnoDB
주누
2022. 8. 31. 23:53
InnoDB 개요
InnoDB는 레코드 기반의 잠금을 제공하여 그로 인해 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어나다.
InnoDB 특징
프라이머리 키에 의한 클리스터링
InnoDB의 모든 테이블은 프라이머리 키 값의 순서대로 디스크에 저장된다.
첨언하자면 클러스터형 인덱스는 영어사전이다.
영어사전은 알파벳 순으로 정렬되어 있다는 특징이 있으며 보조 인덱스는 일반 책의 뒤편에 있는 찾아보기와 같다.
찾아보기를 통해 키워드에 해당하는 내용을 빠르게 찾을 수 있다는 특징이 있다.
외래 키 지원
외래 키는 InnoDB만 유일하게 지원한다.
외래 키 설정 시 주의사항
- 외래 키 연관 테이블에 대한 잠금 전파 주의
- 데드락 발생 주의
- foreign_key_checks Option을 통해 외래 키 체크 해제 가능
MVCC (Mutli Version Concurrency Control)
InnoDB는 언두 로그 (Undo log)를 이용하여 트랜잭션의 격리 수준에 따른 레코드를 조회하는 것이 가능하다.
트랜잭션 격리수준
- READ UNCOMMITTED (커밋되지 않은 읽기)
- READ COMMITTED (커밋된 읽기)
- REPEATABLE READ (반복 가능한 읽기)
- SERIALIZABLE (직렬화 가능)
- 최초 Insert 시점에는 버퍼 풀과 디스크에 데이터 적재
- Update 시점에는 버퍼 풀에 데이터를 갱신하고 기존 데이터를 언두 로그에 적재한다.
- 트랜잭션이 롤백되는 경우에는 언두 로그에 적재된 데이터를 다시 버퍼 풀로 복구하고 언두에 있는 데이터를 삭제 처리한다.
- Update 쿼리에 대한 커밋 이전에 대상 테이블을 조회하면 격리 수준에 따라 다른 조회 결과를 발생시킨다.
Undo 영역은 트랜잭션이 없을 때 비로소 데이터를 삭제하기 때문에 긴 트랜잭션을 발생시키면 언두 영역에 부하를 줄 수 있기 때문에 가능한 빨리 커밋 혹은 롤백을 통해 트랜잭션을 완료하는 것이 바람직한 방법이다.
잠금 없는 일관된 읽기 (Non - Locking Consistent Read)
앞서 살펴보았던 MVCC가 가능하였던 이유는 테이블에 대한 잠금을 설정하지 않았기 때문이다.
조회 시 기본적으로 갱신된 데이터를 참조하지 않고 언두 로그에 대한 데이터를 참조하기 때문에 테이블에 대한 잠금이 필요 없다.
References
https://dev.mysql.com/doc/refman/8.0/en/ansi-diff-foreign-keys.html