InnoDB 스토리지 엔진 아키텍처
InnoDB 구조 (출처)
8.0 버전부터 기존 스토리지 엔진으로 사용
레코드 기반 잠금 제공 → 높은 동시성 처리 가능
프라이머리 키에 의한 클러스터링
기본적으로 InnoDB의 모든 테이블은 프라이머리 키를 기준으로 클러스터링 되어 저장한다.
PK Value의 순서대로 디스크에 저장된다.
- PK가 클러스터링 인덱스 이기에 PK를 이용한 레인지 스캔은 빨리 처리될 수 있다.
- 쿼리 실행 계획에서 PK는 기본적으로 다른 보조 Index에 비해 비중이 높게 설정된다. (쿼리 실행 계획서에서 다른 보조 Index보다 PK가 선택될 확률이 높음)
반대로 MyISAM 스토리지 엔진에서는 클러스터링 키를 지원하지 않는다.
- MyISAM 테이블에서는 PK와 세컨더리 인덱스는 구조적으로 차이가 없다. (PK는 단지 유니크 제약을 가진 세컨더리 인덱스)
- MyISAM 테이블의 모든 인덱스는 물리적인 레코드 주소 값(ROWID)를 가진다.
외래 키 지원
외래 키 지원은 InnoDB 엔진 레벨에서 지원하는 기능이기에 MyISAM, MEMORY 테이블에서는 사용 할 수 없다.
InnoDB 에서 외래 키는 부모 테이블과 자식 테이블 모두 잠금이 전파된다.
이로 인해 데드락이 발생할 수도 있으므로 외래 키 존재에 주의해야 한다.
외래 키에 의해 데이터 변경 작업이 불가능하다면 foreign_key_checks
시스템 변수를 OFF로 설정하면 된다.
SET foreign_key_checks=OFF;
SET foreign_key_checks=ON;
-- 현재 세션에서만 설정할 경우
SET SESSION foreign_key_checks=OFF;
- 작업한 외래키에 연관된 테이블의 데이터도 같이 일관성을 맞추고
foreign_key_checks
를 활성화 해야 한다.
MVCC(Multi Version Concurrency Control)
레코드 레벨의 트랜잭션을 DBMS에서 지원하는 기능이다.
MVCC의 목적은 잠금을 사용하지 않은 일관된 읽기를 제공하는 데 있다.
InnoDB는 Undo log
를 이용해 구현한다.
- 멀티 버전 : 하나의 레코드에 대해 여러 개의 버전이 동시에 관리된다는 의미
잠금 없는 일관된 읽기
- MVCC 기술을 이용해 락을 걸지 않고 읽기 작업을 수행한다.
- 격리 수준이
READ_UNCOMMITTED
READ_COMMITTED
REPEATABLE_READ
라면 순수한 읽기SELECT
작업은 다른 트랜잭션 변경과 관계 없이 바로 실행된다.
- 격리 수준이
- 특정 사용자가 레코드를 변경하고 아직 COMMIT을 하지 않았을 경우에는 변경 트랜잭션이 다른 사용자의
SELECT
작업에 영향이 가지 않는다.- '잠금 없는 일관된 읽기' 라고 하며, 변경 전 데이터를 읽기 위해 UNDO log를 활용한다.
자동 데드락 감지
내용이 길어져 따로 분리하여 정리하였다. 링크